Linux 程序控制

2021-09-24 16:19:23 字數 2327 閱讀 6933

一.

1.程序建立

fork函式:它從已存在程序中建立乙個新程序。新程序為子程序,而原程序為父程序。

#includepid_t fork();

返回值:子程序返回0,父程序返回子程序id,出錯返回-1

2.程序終止

常見退出方法

(1)從main返回:退出前重新整理緩衝區

(2)呼叫exit:退出前重新整理緩衝區,任意位置呼叫都是退出程序

(3)_exit:不重新整理緩衝區,緩衝區資料被丟棄,任意位置呼叫都是退出程序

_exit函式

#includevoid _exit(int status);
exit函式

#includevoid exit(int status);
return退出

呼叫main的執行時函式會將main的返回值當作exit的引數

3.程序等待

獲取退出子程序的返回值,避免子程序成為殭屍程序

wait方法

#include#includepid_t wait(int* status);

返回值:成功返回被等待程序pid,失敗返回-1

引數:輸出型引數,獲取子程序退出狀態

waitpid方法

pid_t waitpid)pid_t pid,int* status,int options);

返回值:正常返回時waitpid返**集到的子程序的程序id

若設定了wnohang,而呼叫中waitpid發現沒有已退出的子程序可收集,則返回0

呼叫**錯,返回-1,errno會被設定成相應的值以指示錯誤所在

二.編寫自主shell

#include#include#include#include#include#includeint main()

; scanf("%[^\n]%*c",tmp);

printf("[%s]\n",tmp);

//需要將整體字串解析出:程式名稱+引數

//"ls -a -l"->"ls" "-a" "-l"

char *ptr=tmp;

int argc=0;

char *ar**[32]=;

while(*ptr!='\0')

ptr++;

}ar**[argc]=null;

if(!strcmp(ar**[0],"cd"))

int pid=fork();

if(pid==0)

//等待子程序退出,避免殭屍程序

三.1.popen

popen()函式通過建立乙個管道,呼叫fork產生乙個子程序,執行乙個shell以執行命令來開啟乙個程序。這個程序必須由pclose()函式關閉,而不是fclose()函式。pclose()函式關閉標準i/o流,等待命令執行結束,然後返回shell的終止狀態。如果shell不能被執行,則pclose()返回的終止狀態與shell已執行exit一樣。

2.system

system()會呼叫fork()產生子程序,由子程序來呼叫/bin/sh-c string來執行引數string字串所代表的命令,此命令執行完後隨即返回原呼叫的程序。在呼叫system()期間sigchld 訊號會被暫時擱置,sigint和sigquit 訊號則會被忽略。

3.popen/system和fork的區別

(1)執行流程

system:在執行期間呼叫程序會一直等待shell命令執行完成

popen:無須等待shell命令執行完成就返回(並行執行),popen後需要呼叫pclose防止子程序變成」殭屍」狀態。

fork :執行期間父程序等待子程序的退出碼

(2)訊號處理

system:對sigchld、sigint、sigquit都做了處理,

popen: 沒有對訊號做任何的處理。

system()呼叫堆訊號遮蔽的原因是因為system能夠及時的退出

並且能夠正確的獲取子程序的退出狀態(成功**子程序)。

popen()函式中沒有遮蔽sigint、sigquit的原因

是因為popen是」並行的」,不能影響其它」並行」程序。

(3)功能

system:執行shell命令最後返回是否執行成功,

popen:執行命令並且通過管道和shell命令進行通訊。

linux 程序控制

什麼是程序 每乙個程序在系統中都有唯一的id標示它,此id為程序標示符 程序標示符的型別 pit t,其實是乙個無符號整形 乙個程序標示符對應唯一的乙個程序,多個程序標示符可以對應同乙個程式 程序和程式的區別 程式 可執行的二進位制 檔案,這種檔案載入到記憶體中執行就得到了乙個程序 程序 同乙個程式...

Linux程序控制

linux程序控制 獲取pid include include pid t getpdi void 獲取本程序id pdi t getppid vodi 獲取父程序id,及獲取建立子程序的程序id 程序建立 include pid t fork void 建立子程序 呼叫一次返回兩次值 1.父程序中...

linux程序控制

linux程序控制 編寫命令直譯器 一 背景 之前在 計算機作業系統 這本書中已經多次接觸了程序這一概念,而程序在作業系統中具體是做什麼的呢?卻沒有實際的與程序發生過互動,因此也就沒有實際的感受。對於我來說程序僅僅停留在概念的層面上 程序是程式執行時的記憶體空間和設定或者說程序就是程式的進行時。沒有...