linux c 函数专挑,Linux C wait函数
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爱会不会重来歌词是哪首歌啊?
- 下一篇: linux版魔兽服务端,linux下玩w