fork在shell中如何工作
#include<stdio.h>
main()
{
int ret_from_fork,mypid;
mypid = getpid();
printf("Before: my pid is %d\n",mypid);
ret_from_fork=fork();
sleep(1);
printf("After:my pid is %d ,fork() said %d\n",
getpid(),ret_from_fork);
}
輸出:
Before: my pid is 24702
After:my pid is 24702 ,fork() said 24703
After:my pid is 24703 ,fork() said 0
? 這里看到三行輸出,一行Before:信息和兩行After:信息。進(jìn)程24702現(xiàn)是打印Before:消息,然后它又打印After消息----一切正常,另一個(gè)After:信息由進(jìn)程24703打印的。注意進(jìn)程24703沒(méi)有打印Before:信息。
? 內(nèi)核通過(guò)復(fù)制進(jìn)程 24702來(lái)創(chuàng)建進(jìn)程 24703,它將 24702的代碼和當(dāng)前運(yùn)行到的位置都復(fù)制給 4171 。其中當(dāng)前運(yùn)行的位置是由隨著代碼向下移動(dòng)的箭頭表示的。新的進(jìn)程 24703從fork 返回的地方開始運(yùn)行,而不是從開頭開始運(yùn)行。因?yàn)?24703是從中間開始運(yùn)行的,也就不打印 Before: 信息了 。
#include<stdio.h>
main()
{
printf("my pid is %d",getpid());
fork();
fork();
fork();
printf("my pid is %d",getpid());
}
//這塊代碼很奇怪,只輸出4條,按理說(shuō)子進(jìn)程也能fork出來(lái)子進(jìn)程啊
#include<stdio.h>
main()
{
int fork_rv;
printf("Before: mypid is %d\n",getpid());
fork_rv = fork();
if(fork_rv == -1)
perror("fork");
else if (fork_rv==0)
printf("I am the child. mypid =%d",getpid());
else
printf("I am the parent. mypid =%d",getpid());
}
? 系統(tǒng)調(diào)用fork正是解決shell只能運(yùn)行一條命令這個(gè)問(wèn)題所需要的。使用fork不但能夠創(chuàng)建新的進(jìn)程,而且能夠分辨原來(lái)的進(jìn)程和新創(chuàng)建的進(jìn)程。新的進(jìn)程能調(diào)用execvp來(lái)執(zhí)行任何用戶指明的程序。這里明確建立一個(gè)shell所需三項(xiàng)技術(shù)中的兩項(xiàng)。知道了如何建立進(jìn)程(fork)和如何運(yùn)行一個(gè)程序(execvp)。最后需要知道如何讓父進(jìn)程等待子進(jìn)程結(jié)束。