linu學習筆記 父程序與子程序的關係(通俗理解)

2021-08-29 01:13:06 字數 2214 閱讀 2993

**執行環境資訊:

unbuntu 16.04

#include "apue.h"

#include

intmain

(void

)else

if(pid >0)

else

if(pid ==0)

/* parent */if(

(pid =

waitpid

(pid,

&status,0)

)<0)

else

printf

("%% ");

}exit(0

);}

執行結果:
root@unbuntu-virtual-machine:

/home/unbuntu/

001# .

/a.out

----

----

----parent start--

----

----

----

-% who

----now is parent

----now is son

unbuntu tty7 2018-10

-1123:

48(:0

)------

--my son success exit--

----

----

--% ls

----now is parent

----now is son

a.out error.c hello.c makefile pid_parent_son.c shell2.c uidgid.c

data getcputc.c ls1.c mycat.c shell1.c testerror.c wirte

----

----my son success exit--

----

----

--%

以上**所使用的函式簡要說明

①呼叫pid =fork() 有兩種情況,

一種是 在父程序中呼叫,會直接得到乙個大於0的pid值;

另一種是在子程序中呼叫 pid =fork()(此時不會建立新的子程序,會直接返回乙個pid=0的值)

②waitpid是由父程序呼叫,子程序不會呼叫該函式(父執行緒呼叫來觀察子程序情況)

觀察上述**執行結果可得知:

①父程序與子程序執行順序:第一次執行**時,父程序首先啟動,執行到 pid = fork(),會建立乙個子程序,子程序此時開始執行父程序中pid=fork()後續**邏輯(這表示並不執行父程序所有**邏輯);

②父程序監控程序:子程序此時已經執行了,父程序為了監控程序(子程序和父程序)運**況,呼叫waitpid函式進行監控,在子程序執行過程中,父程序不會消亡,一直處於執行狀態,子執行緒執行完成後,執行waitpid檢視當前程序情況

所以每輸入一次 指令執行一次結果,就開啟了乙個子程序

理解難點:不同執行階段(即不同執行場景階段),某段**此時執行物件是誰(子程序還是父程序執行的)

root@unbuntu-virtual-machine:/home/unbuntu/001# ./a.out

------------parent start---------------

% who

----now is parent

----now is son

unbuntu tty7 2018-10-11 23:48 (:0)

--------my son success exit------------

% ls

----now is parent

----now is son

a.out error.c hello.c makefile pid_parent_son.c shell2.c uidgid.c

data getcputc.c ls1.c mycat.c shell1.c testerror.c wirte

--------my son success exit------------

%

以上 粗體部分表示 父程序執行得來結果,非粗體表示子程序執行得來的

父程序與子程序管道

int main else return 0 先在父程序中建立管道,然後建立子程序,子程序複製了父程序管道檔案的檔案描述符,所以父程序和子程序各具有2個管道描述符,當在子程序中關閉讀端,這時關閉的是子程序中管道檔案的讀端,而父程序的讀端沒有關閉,這時子程序往寫段寫資料的時候,因管道讀端未完全關閉,所...

子程序與父程序的簡單應用

示例 在單核處理器裡,絕對的多程序是不存在的,那為什麼大家說也有多程序的存在,單核處理器的多程序實際上使用時間分配的概念做的,如果有同時有幾個程式要跑,那麼處理器就去分配一下。不是絕對的,大家一起執行,多核處理器的程序一般是絕對的,就是大家一起跑。同時進行。為什麼要有用多程序,使用多程序能更好的提高...

子程序父程序檔案共享

父子程序全域性變數不共享 寫時複製,讀時共享 檔案父子共享,而且關閉時父子程序都要close fd 我的理解是 雖然fork前的 只執行一次,但是建立子程序時複製使用者空間,此時檔案的狀態一同複製了 驗證父子程序,檔案共享 int main int argc,char ar else if pid ...