物聯網學習教程—Linux系統程式設計之多工實現(二)
在系統程式設計中實現多工還使用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 物聯網學習教程—Linux系統程式設計之程式介紹Linux程式設計
- 物聯網教程Linux系統程式設計——特殊程式之殭屍程式Linux程式設計
- 物聯網教程Linux系統程式設計——特殊程式之守護程式Linux程式設計
- 物聯網學習教程Linux系統程式設計之檔案描述符的複製:dup()和dup2()Linux程式設計
- 物聯網學習教程—多型的實現機制多型
- 物聯網學習教程—檔案的讀寫二
- 物聯網學習教程——二維陣列的引用陣列
- 物聯網學習教程——if語句
- Linux系統程式設計【5】——stty的學習Linux程式設計
- 網工的Linux系統學習歷程Linux
- 物聯網學習教程——switch語句
- 物聯網學習教程——if語句2
- 物聯網學習教程—Linux 可執行檔案結構與程式結構Linux
- 物聯網學習教程—字串與指標字串指標
- 物聯網學習教程—const關鍵字
- 物聯網學習教程—檔案的定位
- 物聯網學習教程——執行緒池執行緒
- 物聯網學習教程—列舉型別型別
- 物聯網學習教程—常見錯誤和程式除錯除錯
- 系統架構設計筆記(106)—— 物聯網架構筆記
- 縱論物聯網(六):基於Linux的物聯網作業系統Linux作業系統
- 物聯網學習教程—Const用法和體會
- 物聯網學習教程—const用法的體會
- 得物社群計數系統設計與實現
- 5分鐘課程:物聯網的系統設計
- 為什麼Python程式設計師需要學習Linux系統?Python程式設計師Linux
- 數字工廠如何建設物聯網資料採集系統
- 物聯網學習教程—c++學習應該注意的點C++
- 好程式設計師Java教程分享如何系統的學習Java程式設計師Java
- 物聯網學習教程——格式輸入與輸出
- 物聯網學習教程—檔案的讀寫一
- 物聯網學習教程—— 執行緒私有資料執行緒
- 物聯網學習教程——一維陣列的引用陣列
- 物聯網學習教程—函式的返回值函式
- 物聯網學習教程—用typedef定義型別型別
- 玩轉 PHP 網路程式設計全套之多程式程式設計PHP程式設計
- 縱論物聯網(五):除了Linux,還有什麼物聯網作業系統Linux作業系統
- 工業物聯網智慧儲能系統解決方案