日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++ 进程的探索(fork函数)

發布時間:2025/3/15 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++ 进程的探索(fork函数) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

總結:

父進程先退出,子進程成為孤兒進程。子進程先退出,父進程沒有察覺到,子進程會成為僵尸進程。

?

本次實驗目的是學習進程fork函數的使用以及注意事項。

實驗環境為ubuntu16.04 編譯器是gcc 5.4

廢話不多說,先上代碼了。一會解釋。

#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <dirent.h> #define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \}while(0)int main() {printf("before fork pid = %d\n",getpid());pid_t pid;pid = fork();if(pid == -1){ERR_EXIT("fork error");}if(pid > 0){printf("this is pareent pid = % d childpid = %d\n",getpid(),pid);}else if(pid == 0){printf("this is child = %d parentpid = %d \n",getpid(),getppid());}return 0; }

解釋一下主函數下第一行代碼,

printf("before fork pid = %d\n",getpid());

這行代碼是打印當前程序得進程號,getpid()是獲取當前程序得進程號,并且打印出來。想要查看getpid函數可以man 2 getpid 一下。

pid = fork();

這句代碼是復制進程的函數,

當復制進程成功,子進程返回0,父進程返回子進程的ID,失敗返回-1.

這又有下面的代碼

if(pid == -1){ERR_EXIT("fork error");}if(pid > 0){printf("this is pareent pid = % d childpid = %d\n",getpid(),pid);}else if(pid == 0){printf("this is child = %d parentpid = %d \n",getpid(),getppid());}

如果pid == -1 打印錯誤信息。如果pid > 0 打印父進程ID和pid(也就是子進程ID)如果 pid == 0 打印子進程ID和父進程ID

其中getppid函數是獲取父進程ID的函數

這個是打印結果,很奇怪。

第一個奇怪點,打印了三行。

按以前的思維pid只有一種狀態要么大于0要么等于0,怎么會執行兩者都執行了。這個說起了就是fork函數的關系, fork函數創建了一個子進程。那么 pid == 0 的代碼是要在子進程中執行的,pid > 0是要在父進程中執行的。可以理解為CPU同一時間干了兩件事,事實上并不是這樣,事實上是cpu切換進程來實現的,比如干一件事干了1ms切換到第二件事干了1ms又切換到第一件事,這樣來回切換,給人的感覺就是cpu在同時干兩件事。這就是為什么可以輸出三行。

fork函數一次調用兩次返回。兩個是在各自的地址空間返回的。

還有一個奇怪的地方那就是為什么子進程中的父進程是1 不應是7807嗎?這個是因為父進程先執行完,執行完的進程及退出了,吧子進程托孤給1號進程。所以就出現這個現象,假如子進程先執行完,父進程在執行完就不會這樣了。下面我們可以讓父進程睡眠1S試試,這樣父進程就不會比子進程先執行完。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>
#define ERR_EXIT(m)?? ??? ??? ?\
?? ?do?? ??? ??? ??? ??? ??? ?\
?? ?{?? ??? ??? ??? ??? ??? ?\
?? ??? ?perror(m);?? ??? ??? ?\
?? ??? ?exit(EXIT_FAILURE);?? ?\
?? ?}while(0)
?
int main()
{
?? ?printf("before fork pid = %d\n",getpid());
?? ?pid_t pid;
?? ?pid = fork();
?? ?if(pid == -1)
?? ?{
?? ??? ?ERR_EXIT("fork error");
?? ?}
?? ?if(pid > 0)
?? ?{
?? ??? ?sleep(1);
?? ??? ?printf("this is pareent pid = % d childpid = %d\n",getpid(),pid);
?? ?}else if(pid == 0)
?? ?{
?? ??? ?printf("this is child = %d parentpid = %d \n",getpid(),getppid());
?? ?}
?? ?return 0;
}
?

看結果:

本次代碼只在上次代碼基礎上增加了一行代碼:

那就是sleep(1);

這行代碼的意思是睡眠1s的意思,延遲父進程的時間。?

?

僵尸進程:子進程先退出,父進程尚未查詢子進程退出狀態,子進程就是僵尸狀態。

修改sleep(100)子進程為8029 父進程為8028

查看子進程用 ?ps -ef 查看

其中<defunct>的意思就是僵尸進程。

如何避免僵尸進程:

只需要添加一個信號即可,

#include <signal.h>

在main函數下添加

signal(SIGCHLD,SIG_IGN);

即可避免僵尸進程;

上代碼:

#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <dirent.h> #include <signal.h> #define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \}while(0)int main() {signal(SIGCHLD,SIG_IGN);printf("before fork pid = %d\n",getpid());pid_t pid;pid = fork();if(pid == -1){ERR_EXIT("fork error");}if(pid > 0){sleep(100);printf("this is pareent pid = % d childpid = %d\n",getpid(),pid);}else if(pid == 0){printf("this is child = %d parentpid = %d \n",getpid(),getppid());}return 0; }

這就是結果僵尸進程已經不見了。?

?

總結:

父進程先退出,子進程成為孤兒進程。子進程先退出,父進程沒有察覺到,子進程會成為僵尸進程。

?

?

總結

以上是生活随笔為你收集整理的C/C++ 进程的探索(fork函数)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 三上悠亚在线播放 | 男女视频在线观看免费 | 亚洲香蕉在线观看 | 亚洲av无码一区二区三区dv | 亚洲一区二区三区成人 | 久久天天综合 | 成人在线国产 | 91丝袜一区在线观看 | 中文字幕乱码人妻一区二区三区 | 爱爱精品视频 | 精品国产视频在线 | 男女免费视频网站 | 日韩免费观看一区二区 | 国产精品成熟老女人 | 亚洲av成人无码久久精品 | 男人插女人网站 | 中文无码精品一区二区三区 | 青青青青草 | 高跟av| 在线成人日韩 | 日韩欧美亚洲一区二区三区 | 日本一区二区三区在线视频 | 欧美丰满老熟妇xxxxx性 | 国产丝袜自拍 | 国产九九精品视频 | 中文字幕乱码一二三区 | 韩国日本美国免费毛片 | 欧美午夜寂寞影院 | 婷婷午夜天 | 69色视频| 精品国产无码一区二区 | 热逼视频 | 二十四小时在线更新观看 | jizzjizz在线播放 | 日本欧美另类 | 丰满熟女人妻一区二区三区 | 99久久久无码国产精品性色戒 | 欧美日韩精品一区 | 男女操操操 | 自拍偷拍2019| 91蝌蚪少妇偷拍 | 无码一区二区三区免费 | 日韩中文字幕在线视频 | 91美女网站 | 一区二区中文字幕在线观看 | julia中文字幕在线 | 欧美高清性 | 国产视频一 | 久久三级网站 | 成年网站免费在线观看 | 日韩不卡毛片 | 蜜乳av懂色av粉嫩av | 国产粉嫩在线 | 善良的公与媳hd中文字 | 欧美性区 | 亚洲视频免费 | 免费毛片看 | 91精品福利视频 | 黄av在线播放 | 性——交——性——乱免费的 | 国产天堂av| 日韩亚洲精品中文字幕 | 欧美成人免费网站 | 国产日韩视频 | 国产成人精品影视 | 蝌蚪网在线视频 | 嫩草研究院在线观看 | 亚色图| 国内偷拍久久 | 亚洲激情偷拍 | 亚洲国产成人va在线观看天堂 | 伊人激情综合网 | 免费看av毛片 | 91视频免费视频 | 青青艹在线观看 | 久久九九精品 | 日本少妇xxx | 亚洲AV无码一区二区三区蜜桃 | 国产小视频自拍 | 免费又黄又爽又猛大片午夜 | 人人澡超碰碰97碰碰碰 | 中文字幕一区二区人妻视频 | 丰满大乳露双乳呻吟 | 欧美第五页 | 亚洲深夜av | 日本xxxxxxxxx| 日本一区二区三区在线免费观看 | 美妇湿透娇羞紧窄迎合 | 天天插日日干 | 捆绑少妇玩各种sm调教 | 免费无码又爽又黄又刺激网站 | 国产精品久久婷婷六月丁香 | 青青久久久| 欧美十大老熟艳星 | 国产一级片一区二区 | 成人免费久久 | 日韩精品免费一区二区夜夜嗨 | 亚洲人人干 | 精品黑人一区二区三区观看时间 |