**執行環境資訊:
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 ...