亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

c語言中調用Linux腳本

2020-02-24 14:24:41
字體:
來源:轉載
供稿:網友

沒有接觸過linux系統的朋友們一般都是不知道如何調用c語言中的linux腳本,下面想小編為大家帶來c語言中調用Linux腳本的內容,需要的朋友可以過來參考下。

一、引言
對于沒有接觸過Unix/Linux操作系統的人來說,fork是最難理解的概念之一:它執行一次卻返回兩個值。fork函數是Unix系統最杰出的成就之一,它是七十年代UNIX早期的開發者經過長期在理論和實踐上的艱苦探索后取得的成果,一方面,它使操作系統在進程管理上付出了最小的代價,另一方面,又為程序員提供了一個簡潔明了的多進程方法。與DOS和早期的Windows不同,Unix/Linux系統是真正實現多任務操作的系統,可以說,不使用多進程編程,就不能算是真正的Linux環境下編程。

多線程程序設計的概念早在六十年代就被提出,但直到八十年代中期,Unix系統中才引入多線程機制,如今,由于自身的許多優點,多線程編程已經得到了廣泛的應用。

下面,我們將介紹在Linux下編寫多進程和多線程程序的一些初步知識。

二、多進程編程
什么是一個進程?進程這個概念是針對系統而不是針對用戶的,對用戶來說,他面對的概念是程序。當用戶敲入命令執行一個程序的時候,對系統而言,它將啟動一個進程。但和程序不同的是,在這個進程中,系統可能需要再啟動一個或多個進程來完成獨立的多個任務。多進程編程的主要內容包括進程控制和進程間通信,在了解這些之前,我們先要簡單知道進程的結構。

2.1 Linux下進程的結構
Linux下一個進程在內存里有三部分的數據,就是"代碼段"、"堆棧段"和"數據段"。其實學過匯編語言的人一定知道,一般的CPU都有上述三種段寄存器,以方便操作系統的運行。這三個部分也是構成一個完整的執行序列的必要的部分。

"代碼段",顧名思義,就是存放了程序代碼的數據,假如機器中有數個進程運行相同的一個程序,那么它們就可以使用相同的代碼段。"堆棧段"存放的就是子程序的返回地址、子程序的參數以及程序的局部變量。而數據段則存放程序的全局變量,常數以及動態數據分配的數據空間(比如用malloc之類的函數取得的空間)。這其中有許多細節問題,這里限于篇幅就不多介紹了。系統如果同時運行數個相同的程序,它們之間就不能使用同一個堆棧段和數據段。

2.2 Linux下的進程控制
在傳統的Unix環境下,有兩個基本的操作用于創建和修改進程:函數fork( )用來創建一個新的進程,該進程幾乎是當前進程的一個完全拷貝;函數族exec( )用來啟動另外的進程以取代當前運行的進程。Linux的進程控制和傳統的Unix進程控制基本一致,只在一些細節的地方有些區別,例如在Linux系統中調用vfork和fork完全相同,而在有些版本的Unix系統中,vfork調用有不同的功能。由于這些差別幾乎不影響我們大多數的編程,在這里我們不予考慮。

2.2.1 fork()
fork在英文中是"分叉"的意思。為什么取這個名字呢?因為一個進程在運行中,如果使用了fork,就產生了另一個進程,于是進程就"分叉"了,所以這個名字取得很形象。下面就看看如何具體使用fork,這段程序演示了使用fork的基本框架:

?

void main()
{
??? int i;
??? if ( fork() == 0 )
??? {
?????? /* 子進程程序 */
?????? for ( i = 1; i <1000; i ++ )
????????? printf("This is child process/n");
??? }
??? else
??? {
?????? /* 父進程程序*/
?????? for ( i = 1; i <1000; i ++ )
?????? printf("This is process process/n");
??? }
}


程序運行后,你就能看到屏幕上交替出現子進程與父進程各打印出的一千條信息了。如果程序還在運行中,你用ps命令就能看到系統中有兩個它在運行了。

?

那么調用這個fork函數時發生了什么呢?fork函數啟動一個新的進程,前面我們說過,這個進程幾乎是當前進程的一個拷貝:子進程和父進程使用相同的代碼段;子進程復制父進程的堆棧段和數據段。這樣,父進程的所有數據都可以留給子進程,但是,子進程一旦開始運行,雖然它繼承了父進程的一切數據,但實際上數據卻已經分開,相互之間不再有影響了,也就是說,它們之間不再共享任何數據了。它們再要交互信息時,只有通過進程間通信來實現,這將是我們下面的內容。既然它們如此相象,系統如何來區分它們呢?這是由函數的返回值來決定的。對于父進程, fork函數返回了子程序的進程號,而對于子程序,fork函數則返回零。在操作系統中,我們用ps函數就可以看到不同的進程號,對父進程而言,它的進程號是由比它更低層的系統調用賦予的,而對于子進程而言,它的進程號即是fork函數對父進程的返回值。在程序設計中,父進程和子進程都要調用函數fork()下面的代碼,而我們就是利用fork()函數對父子進程的不同返回值用if...else...語句來實現讓父子進程完成不同的功能,正如我們上面舉的例子一樣。我們看到,上面例子執行時兩條信息是交互無規則的打印出來的,這是父子進程獨立執行的結果,雖然我們的代碼似乎和串行的代碼沒有什么區別。

讀者也許會問,如果一個大程序在運行中,它的數據段和堆棧都很大,一次fork就要復制一次,那么fork的系統開銷不是很大嗎?其實UNIX自有其解決的辦法,大家知道,一般CPU都是以"頁"為單位來分配內存空間的,每一個頁都是實際物理內存的一個映像,象INTEL的CPU,其一頁在通常情況下是 4086字節大小,而無論是數據段還是堆棧段都是由許多"頁"構成的,fork函數復制這兩個段,只是"邏輯"上的,并非"物理"上的,也就是說,實際執行fork時,物理空間上兩個進程的數據段和堆棧段都還是共享著的,當有一個進程寫了某個數據時,這時兩個進程之間的數據才有了區別,系統就將有區別的" 頁"從物理上也分開。系統在空間上的開銷就可以達到最小。

下面演示一個足以"搞死"Linux的小程序,其源代碼非常簡單:

?

void main()
{
?? for( ; ; )
?? {
???? fork();
?? }
}


這個程序什么也不做,就是死循環地fork,其結果是程序不斷產生進程,而這些進程又不斷產生新的進程,很快,系統的進程就滿了,系統就被這么多不斷產生 的進程"撐死了"。當然只要系統管理員預先給每個用戶設置可運行的最大進程數,這個惡意的程序就完成不了企圖了。

?

2.2.2 exec( )函數族
下面我們來看看一個進程如何來啟動另一個程序的執行。在Linux中要使用exec函數族。系統調用execve()對當前進程進行替換,替換者為一個指定的程序,其參數包括文件名(filename)、參數列表(argv)以及環境變量(envp)。exec函數族當然不止一個,但它們大致相同,在 Linux中,它們分別是:execl,execlp,execle,execv,execve和execvp,下面我只以execlp為例,其它函數究竟與execlp有何區別,請通過manexec命令來了解它們的具體情況。

一個進程一旦調用exec類函數,它本身就"死亡"了,系統把代碼段替換成新的程序的代碼,廢棄原有的數據段和堆棧段,并為新程序分配新的數據段與堆棧段,唯一留下的,就是進程號,也就是說,對系統而言,還是同一個進程,不過已經是另一個程序了。(不過exec類函數中有的還允許繼承環境變量之類的信息。)

那么如果我的程序想啟動另一程序的執行但自己仍想繼續運行的話,怎么辦呢?那就是結合fork與exec的使用。下面一段代碼顯示如何啟動運行其它程序:

?

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

?

char command[256];
void main()
{
?? int rtn; /*子進程的返回數值*/
?? while(1) {
?????? /* 從終端讀取要執行的命令 */
?????? printf( ">" );
?????? fgets( command, 256, stdin );
?????? command[strlen(command)-1] = 0;
?????? if ( fork() == 0 ) {/* 子進程執行此命令 */
????????? execlp( command, NULL );
????????? /* 如果exec函數返回,表明沒有正常執行命令,打印錯誤信息*/
????????? perror( command );
????????? exit( errno );
?????? }
?????? else {/* 父進程, 等待子進程結束,并打印子進程的返回值 */
????????? wait ( &rtn );
????????? printf( " child process return %d/n", rtn );
?????? }
?? }
}


此程序從終端讀入命令并執行之,執行完成后,父進程繼續等待從終端讀入命令。熟悉DOS和WINDOWS系統調用的朋友一定知道DOS/WINDOWS也有exec類函數,其使用方法是類似的,但DOS/WINDOWS還有spawn類函數,因為DOS是單任務的系統,它只能將"父進程"駐留在機器內再執行"子進程",這就是spawn類的函數。WIN32已經是多任務的系統了,但還保留了spawn類函數,WIN32中實現spawn函數的方法同前述 UNIX中的方法差不多,開設子進程后父進程等待子進程結束后才繼續運行。UNIX在其一開始就是多任務的系統,所以從核心角度上講不需要spawn類函數。

?

在這一節里,我們還要講講system()和popen()函數。system()函數先調用fork(),然后再調用exec()來執行用戶的登錄 shell,通過它來查找可執行文件的命令并分析參數,最后它么使用wait()函數族之一來等待子進程的結束。函數popen()和函數 system()相似,不同的是它調用pipe()函數創建一個管道,通過它來完成程序的標準輸入和標準輸出。這兩個函數是為那些不太勤快的程序員設計的,在效率和安全方面都有相當的缺陷,在可能的情況下,應該盡量避免。

看完后你學會了c語言中調用Linux腳本的方法嗎,大家要記住有知識豐富才能提升一個人的內在氣質和修養,在這個顏值當道,屌絲閃邊的時代,拼不過顏值拼內涵。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美乱大交做爰xxxⅹ性3| 91色视频在线导航| 成人激情视频网| 尤物yw午夜国产精品视频| 亚洲乱码国产乱码精品精天堂| 日本不卡视频在线播放| 精品亚洲夜色av98在线观看| 国产精品综合不卡av| 国产日韩欧美视频在线| 中文字幕在线看视频国产欧美在线看完整| 国产精品一区久久久| 国产成人亚洲综合| 日韩国产高清污视频在线观看| 亚洲视频在线免费观看| 国产在线视频不卡| 欧美日韩激情网| 91久久国产婷婷一区二区| 欧美日产国产成人免费图片| 日韩成人xxxx| 欧美在线观看视频| 成人天堂噜噜噜| 亚洲激情在线观看| 国产精品自拍偷拍视频| 亚洲韩国青草视频| 亚洲国产精品视频在线观看| 欧美另类69精品久久久久9999| 日韩人体视频一二区| 欧美国产日韩视频| 亚洲男人的天堂在线播放| 久久九九亚洲综合| 色偷偷亚洲男人天堂| 欧美性xxxx极品hd满灌| 在线观看久久久久久| 亚洲精品久久久久久久久| 国语自产在线不卡| 欧美亚洲国产日韩2020| 欧美精品激情blacked18| 免费不卡在线观看av| 精品国产网站地址| 中文字幕日韩专区| 2019av中文字幕| 亚洲国产精品va在线| 欧美俄罗斯乱妇| 国产精品美女呻吟| 欧美高清videos高潮hd| 亚洲精品99久久久久| 亚洲无限乱码一二三四麻| 国产一区二区三区在线观看视频| 欧美精品videos另类日本| 国产精品视频内| 97免费视频在线播放| 亚洲第一中文字幕在线观看| 亚洲精品一区中文字幕乱码| 丰满岳妇乱一区二区三区| 久久综合伊人77777蜜臀| 午夜精品久久久久久久99热浪潮| 亚洲国产成人精品一区二区| 久热精品视频在线观看| 久久91精品国产91久久跳| 亚洲激情视频在线| 国产成人亚洲综合青青| 国产成人精品在线播放| 亚洲第一视频网站| 亚洲淫片在线视频| 色www亚洲国产张柏芝| 欧美国产在线视频| 久久亚洲精品中文字幕冲田杏梨| 欧美成人免费全部观看天天性色| 欧美夫妻性生活视频| 91成人在线观看国产| 色伦专区97中文字幕| 久久99亚洲精品| 亚洲电影av在线| 国产黑人绿帽在线第一区| 亚洲a在线观看| 国产日韩欧美电影在线观看| 欧美日韩一区二区免费在线观看| 91精品在线播放| 国产一区二区丝袜高跟鞋图片| 久久久精品久久久久| 日韩激情视频在线| 国产精品无码专区在线观看| 久久中文字幕国产| 视频一区视频二区国产精品| 国产精品99久久久久久白浆小说| 亚洲电影在线观看| 粗暴蹂躏中文一区二区三区| xxx欧美精品| 国产亚洲xxx| 欧美成人精品不卡视频在线观看| 亚洲精品福利视频| 91午夜在线播放| 一区二区中文字幕| 中文字幕视频在线免费欧美日韩综合在线看| 欧美中文字幕在线观看| 91色精品视频在线| 日本成熟性欧美| 亚洲mm色国产网站| 亚洲欧美国产制服动漫| 中文国产成人精品久久一| 一区二区三区精品99久久| 亚洲午夜国产成人av电影男同| 久久久久久久色| 最近免费中文字幕视频2019| 亚洲尤物视频网| 久久天天躁狠狠躁夜夜av| 日韩免费av在线| 欧美巨大黑人极品精男| 亚洲人午夜色婷婷| 国产精品高潮呻吟久久av无限| 51午夜精品视频| 国色天香2019中文字幕在线观看| 亚洲自拍小视频免费观看| 精品国产欧美成人夜夜嗨| 国产成人精品电影久久久| 伊人青青综合网站| 国产精品永久免费观看| 国产精品久久久久99| 亚洲性线免费观看视频成熟| 日韩一区二区久久久| 国产精品视频资源| 日本视频久久久| 成人黄色影片在线| 中文字幕久精品免费视频| 亚洲a级在线观看| 国产日韩欧美视频在线| 欧美性极品xxxx娇小| 欧美成人性生活| 久久国产精品99国产精| 日本久久久久久久久久久| 欧美午夜无遮挡| 久久久久日韩精品久久久男男| 亚洲区在线播放| 日本韩国欧美精品大片卡二| 国产视频久久网| 中文字幕欧美国内| 久久色在线播放| 日韩av在线免播放器| 国产日本欧美一区二区三区在线| 国产97在线视频| 日本欧美精品在线| 国产99久久精品一区二区| 国产999精品久久久| 韩国欧美亚洲国产| 亚洲精品欧美一区二区三区| 国产精品电影网站| 中日韩午夜理伦电影免费| 国内揄拍国内精品| 欧美性猛交xxxx黑人猛交| 久久韩剧网电视剧| 日韩欧美中文第一页| 国产91精品久久久久久久| 韩日欧美一区二区| 国产欧美日韩丝袜精品一区| 欧美—级高清免费播放| 日韩女优人人人人射在线视频| 综合网日日天干夜夜久久| 欧美视频专区一二在线观看| 久久久亚洲国产天美传媒修理工| 成人夜晚看av| 国内精品国产三级国产在线专| 中文字幕欧美精品在线| 久久久久久国产精品三级玉女聊斋| 欧美怡春院一区二区三区|