程序學習 初見程序

2021-08-09 09:48:44 字數 2491 閱讀 2512

程序

pid_t fork(void);

功能:建立乙個新的程序

引數:無

返回值:

成功:如果是父程序返回子程序的pid號;如果是子程序返回0;

失敗:返回-1

特點一:呼叫一次,返回兩次

#include 

#include

#include

int main(int argc, const

char *argv)

else

if(pid == 0)

else

if(pid > 0)

printf("this is a fork fuction, pid = %d\n", pid);

return

0;}

編譯執行(如下圖):

第乙個「this is a fork fuction,pid = 0」是子程序列印的;

第二個「this is a fork fuction,pid = 3089」是父程序列印的;

why?

因為以阻塞的方式呼叫了waitpid函式,所以父程序在waitpid這一直處於阻塞等待,直到子程序退出才繼續往下執行(看看pid的值);

特點二:子程序執行的位置

子程序是父程序的副本,它將獲得父程序資料空間、堆、棧、緩衝區等資源的副本。注意,子程序持有的是上述儲存空間的「副本」,這意味著父子程序間不共享這些儲存空間。

0;}看看程序的執行特點:程式從fork處開始**成兩個程序,兩個程序擁有相同的**段、緩衝區等,但是子程序是從fork後邊開始執行的,所以上邊的程式只會執行一次「this is a fork fuction」,是父程序執行的,子程序是不執行這裡的**的,但是這裡也被它複製過去了;

程式編譯執行(如下圖):

特點三:複製緩衝區

#include 

#include

#include

int main(int argc, const

char *argv)

else

if(pid == 0)

else

if(pid > 0)

return

0;}

編譯執行(如下圖):

「this is a fork function」將\n去掉後,沒有重新整理行快取,直到子程序中遇到了\n,重新整理了行快取,直接連原來緩衝區中的這一句與子程序中的語句一起列印了出來;

由於父子程序擁有相同的**,只是執行的位置不一樣,所以父程序遇見\n同樣連同原來的語句一同列印出來;

知識點穿插:

行快取重新整理的條件?

這裡強調一下,只有正常退出才會重新整理快取:

#include 

int main(int argc, const

char *argv)

編譯執行:

行快取沒有被寫滿(行快取1k,這幾個字元不夠),沒有遇見\n,所以,程式執行時會一直進行死迴圈;

現在用kill -9 來殺死它,這屬於非正常退出了,看看快取區刷不重新整理?

看到了吧,hello world沒有列印出來,說明行快取沒有重新整理。

程序學習 4 殭屍程序

一 殭屍程序 當前程序執行結束,但其資源沒有被 二 驗證方法 1.用fork函式建立兩個程序,讓子程序退出,父程序不呼叫wait waitpid為子程序 資源 如下 include include include int main int argc,const char argv else if p...

Linux程序學習 孤兒程序和守護程序

6具體函式實現 編寫乙個守護程序要包括兩部分 主程式 test.c 和初始化程式 init.c 初始化程式中的 init daemon 函式負責生成守護程序。利用 init daemon 函式可以生成自己的守護程序。daemon.c 1 include 2 include 3 include 4 i...

學習筆記 孤兒程序僵死程序

include include include include include include 孤兒程序 int main void if pid 0 if 0 pid return 0 僵死程序 避免方法 建立子程序的時候可以不管子程序,讓linux核心去管 訊號 非同步處理事件,是一種機制.言外...