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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

linux c 函数专挑,Linux C wait函数

發(fā)布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux c 函数专挑,Linux C wait函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

8種機械鍵盤軸體對比

本人程序員,要買一個寫代碼的鍵盤,請問紅軸和茶軸怎么選?

我們先來看一段代碼:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21#include

#include

#include

int ()

{

pid_t id;

id = fork();

if (id == 0)

{

printf("Hello from Child!, pid: %dn", getpid());

}

else

{

printf("Hello from Parent!, pid: %dn", getpid());

}

return 0;

}

執(zhí)行結(jié)果如下:1

2

3

4~/codeDir/cCode/test # ./a.out

Hello from Parent!, pid: 2290

Hello from Child!, pid: 2291

~/codeDir/cCode/test #

我們看看進程狀態(tài):1

2

3

4~/codeDir # ps -a

PID TTY TIME CMD

2292 pts/2 00:00:00 ps

~/codeDir #

我們發(fā)現(xiàn),進程直接退出了。

然后,我們再來看一段代碼:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22#include

#include

#include

int ()

{

pid_t id;

id = fork();

if (id == 0)

{

printf("Hello from Child!, pid: %dn", getpid());

sleep(-1);

}

else

{

printf("Hello from Parent!, pid: %dn", getpid());

}

return 0;

}

我們讓子進程無限阻塞住,然后父進程先退出。執(zhí)行結(jié)果如下:1

2

3

4~/codeDir/cCode/test # ./a.out

Hello from Parent!, pid: 2314

Hello from Child!, pid: 2315

~/codeDir/cCode/test #

我們發(fā)現(xiàn),終端不會卡住,而是直接退出了。說明,終端是否會卡住,是由父進程是否退出決定的。然后,我們看看進程狀態(tài):1

2

3

4

5~/codeDir # ps -a

PID TTY TIME CMD

2315 pts/4 00:00:00 a.out

2316 pts/2 00:00:00 ps

~/codeDir #

我們發(fā)現(xiàn),此時子進程(PID是2315)還存在。因為進程2315的父進程2314不在了,所以進程2315會變成孤兒進程,此時,它的父進程會變成init進程。

此時,我們可以通過wait函數(shù)來等待子進程的結(jié)束:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23#include

#include

#include

int ()

{

pid_t id;

id = fork();

if (id == 0)

{

printf("Hello from Child!, pid: %dn", getpid());

sleep(-1);

}

else

{

wait(NULL);

printf("Hello from Parent!, pid: %dn", getpid());

}

return 0;

}

其中,wait可以等待子進程結(jié)束。代碼執(zhí)行結(jié)果如下:1

2~/codeDir/cCode/test # ./a.out

Hello from Child!, pid: 2327

我們發(fā)現(xiàn),此時的終端沒有直接退出。我們查看一下進程狀態(tài):1

2

3

4

5

6~/codeDir # ps -a

PID TTY TIME CMD

2326 pts/4 00:00:00 a.out

2327 pts/4 00:00:00 a.out

2329 pts/2 00:00:00 ps

~/codeDir #

我們發(fā)現(xiàn),父進程和子進程都沒掛掉。正是因為我們子進程一直沒有退出,所以父進程阻塞在了wait這個地方。

我們再來看一段代碼:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22#include

#include

#include

int ()

{

pid_t id;

id = fork();

if (id == 0)

{

printf("Hello from Child!, pid: %dn", getpid());

}

else

{

printf("Hello from Parent!, pid: %dn", getpid());

sleep(-1);

}

return 0;

}

目的是,子進程退出后,父進程一直阻塞住不退出。

執(zhí)行結(jié)果如下:1

2

3~/codeDir/cCode/test # ./a.out

Hello from Parent!, pid: 2337

Hello from Child!, pid: 2338

因為父進程沒有退出,所以終端會被卡住。此時,我們看看進程狀態(tài)。1

2

3

4

5

6~/codeDir # ps -a

PID TTY TIME CMD

2337 pts/4 00:00:00 a.out

2338 pts/4 00:00:00 a.out

2339 pts/2 00:00:00 ps

~/codeDir #

我們發(fā)現(xiàn),這里依然會看到子進程2338的信息,為什么呢?因為這個子進程目前是一個僵尸進程。我們發(fā)現(xiàn)這個進程旁邊有一個標識defunct,代表這個進程執(zhí)行完了它的任務(wù),已經(jīng)掛了,但是,這個進程的一些基本信息依然保存著。這個僵尸進程的信息依舊被內(nèi)核保存在進程表里面。

我們現(xiàn)在用kill命令給僵尸進程發(fā)送信號看看:1

2

3

4

5

6

7~/codeDir # kill 2338

~/codeDir # ps -a

PID TTY TIME CMD

2337 pts/4 00:00:00 a.out

2338 pts/4 00:00:00 a.out

2342 pts/2 00:00:00 ps

~/codeDir #

我們發(fā)現(xiàn),這個僵尸進程還是會被查找到?為什么呢?因為這個僵尸進程本來就是死的,當然kill會失效。那么,我們?nèi)绾稳ケ苊膺@個問題呢?

可以用wait函數(shù)。wait函數(shù)除了可以等待子進程的結(jié)束,其實還可以獲取到子進程的信息。這也是為什么一個子進程掛了之后,它的基本信息不會立馬被內(nèi)核清除的原因,因為,操作系統(tǒng)認為父進程會在某個時候要用到子進程的一些信息,例如子進程的退出狀態(tài)。只有當父進程獲取完子進程的信息之后,操作系統(tǒng)才會清理子進程殘留的信息。而操作系統(tǒng)如何知道父進程讀取過子進程的信息呢?那就是wait函數(shù)。實際上,wait函數(shù)可以傳入一個獲取子進程信息的結(jié)構(gòu)體,只不過我們的代碼沒有去獲取而已,說明此時我們是不關(guān)心子進程的狀態(tài)的。

分析完之后,我們來看下一段代碼:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24#include

#include

#include

int ()

{

pid_t id;

id = fork();

if (id == 0)

{

printf("Hello from Child!, pid: %dn", getpid());

sleep(1);

}

else

{

wait(NULL);

printf("Hello from Parent!, pid: %dn", getpid());

sleep(-1);

}

return 0;

}

這里,我們的父進程會去調(diào)用wait函數(shù),等待子進程結(jié)束。等子進程執(zhí)行完畢之后,父進程才回去執(zhí)行。一旦父進程調(diào)用了wait函數(shù),操作系統(tǒng)就知道父進程獲取過子進程的信息,因此,操作系統(tǒng)就可以放心的去清理僵尸進程的殘留信息了。

我們執(zhí)行代碼:1

2

3~/codeDir/cCode/test # ./a.out

Hello from Child!, pid: 2350

Hello from Parent!, pid: 2349

我們看看進程的狀態(tài):1

2

3

4

5~/codeDir # ps -a

PID TTY TIME CMD

2349 pts/4 00:00:00 a.out

2351 pts/2 00:00:00 ps

~/codeDir #

我們發(fā)現(xiàn),子進程2350不再出現(xiàn)在進程狀態(tài)列表里面了,說明子進程已經(jīng)被清理完畢了。

總結(jié)

以上是生活随笔為你收集整理的linux c 函数专挑,Linux C wait函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。