物聯網學習教程—Linux系統程式設計之多工實現(二)

千鋒教育官方發表於2019-08-29

在系統程式設計中實現多工還使用vfork函式,其 需要的標頭檔案:

#include <sys/types.h>

#include <unistd.h>

 

Vfork函式原型如下:

pid_t v fork(void);

功能:

vfork() 函式和 fork() 函式一樣都是在已有的程式中建立一個新的程式,但它們建立的子程式是有區別的。

引數:無

返回值:

成功:子程式中返回 0,父程式中返回子程式 ID。pid_t,為無符號整型。

失敗:返回 -1。

 

fork() 與 vfock() 都是建立一個程式,那它們有什麼區別呢?

1)fork(): 父子程式的執行次序不確定。

   vfork():保證子程式先執行,在它呼叫 exec(程式替換) 或 exit(退出程式)之後父程式才可能被排程執行。

2)fork(): 子程式複製父程式的地址空間,子程式是父程式的一個複製品。

   vfork():子程式共享父程式的地址空間(準確來說,在呼叫 exec(程式替換) 或 exit(退出程式) 之前與父程式資料是共享的)

任務一

驗證:透過 vfork() 建立的子程式會執行完後,才到父程式執行:

 

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int main(int argc, char *argv[])

{

pid_t pid;

pid = vfork(); // 建立程式

if(pid < 0){ // 出錯

perror("vfork");

}

if(0 == pid){ // 子程式

sleep(3); // 延時 3 秒

printf("i am son\n");

_exit(0); // 退出子程式,必須

}else if(pid > 0){ // 父程式

printf("i am father\n");

}

return 0;

}

 

上面的程式碼,已經讓子程式延時 3 s,結果還是子程式執行結束後,父程式才執行,執行結果如下:

 

驗證:子程式共享父程式的地址空間

 

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int a = 10;

int main(int argc, char *argv[])

{

pid_t pid;

int b = 20;

pid = vfork(); // 建立程式

if(pid < 0){ // 出錯

perror("vfork");

}

if(0 == pid){ // 子程式

a = 100, b = 200;

printf("son: a = %d, b = %d\n", a, b);

_exit(0); // 退出子程式,必須

}else if(pid > 0){ // 父程式

printf("father: a = %d, b = %d\n", a, b);

}

return 0;

}

 

通常執行結果得知,子程式修改 a, b 的值,會影響到父程式的 a, b, 效果圖如下:

 

 

vfork() 保證子程式先執行,在它呼叫 exec(程式替換) 或 exit(退出程式)之後父程式才可能被排程執行。如果子程式沒有呼叫 exec, exit, 程式則會導致死鎖,程式是有問題的程式,沒有意義,測試程式碼如下:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

 

int main(int argc, char *argv[])

{

pid_t pid;

pid = vfork(); // 建立程式

if(pid < 0){ // 出錯

perror("vfork");

}

if(0 == pid){ // 子程式

printf("i am son\n");

sleep(1);

// 子程式沒有呼叫 exec 或 exit

}else if(pid > 0){ // 父程式

printf("i am father\n");

sleep(1);

}

return 0;

}

 

執行結果如下:

 

 

所以,用 vfork() 建立程式,子程式裡一定要呼叫 exec(程式替換) 或 exit(退出程式),否則,程式會出問題,沒有意義。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69914734/viewspace-2655439/,如需轉載,請註明出處,否則將追究法律責任。

相關文章