linux创建进程
創(chuàng)建進程的函數(shù)為fork(),沒有參數(shù),有兩個返回值。三種值返回。返回0表示返回是子進程調(diào)用fork()函數(shù)的返回值,如果返回的是子進程的pid 則表示是父進程在調(diào)用fork()函數(shù)進的返回,-1表示創(chuàng)建失敗。我們可以認為在父進程調(diào)用fork()函數(shù)后,創(chuàng)建了子進程,子進程再次調(diào)用 fork()。所以fork()實際上是被調(diào)用了兩次。但系統(tǒng)是如何區(qū)別是父進程還是子進程調(diào)用fork()函數(shù),以便返回不同類型的值的呢。這是系統(tǒng)內(nèi) 部的事,暫時我也不明白。
process.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
? ? pid_t ? pid;
? ? pid ? ? = fork();
? ? switch(pid)
? ? { ??
? ? ? ? case 0:
? ? ? ? ? ? printf("child process is runing, pid is : %d\n", getpid());
? ? ? ? ? ? break;
? ? ? ? case -1:?
? ? ? ? ? ? printf("create process faild!\n");
? ? ? ? ? ? break;
? ? ? ? default:
? ? ? ? ? ? printf("parent process is runing, pid is : %d\n", getppid());
? ? } ??
? ? return 0;
}
#cc process.c -o?cc process -g
#./process
由于子進程與父進程的優(yōu)先級相同,所以它們應該是交替執(zhí)行的。可以用下面的代碼說明:
process.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
? ? pid_t ? pid;
? ? int ? ? i; ?
? ? char ? ?*msg;
? ? pid ? ? = fork();
? ? switch(pid)
? ? { ??
? ? ? ? case 0:
? ? ? ? ? ? msg = "child process is runing";
? ? ? ? ? ? i=3;
? ? ? ? ? ? break;
? ? ? ? case -1:?
? ? ? ? ? ? printf("create process faild!\n");
? ? ? ? ? ? break;
? ? ? ? default:
? ? ? ? ? ? msg = "parent process is runing";
? ? ? ? ? ? i=5;
? ? ? ? ? ? break;
? ? } ??
? ? while(i>0)
? ? { ??
? ? ? ? printf("prent pid : %d, chind pid : %d \n", getppid(), getpid());
? ? ? ? puts(msg);
? ? ? ? sleep(1);
? ? ? ? printf("i : %d\n",i);
? ? ? ? i--;
? ? } ??
? ? return 0;
}
#cc process.c -o process -g
#./process?
prent pid : 30478, chind pid : 32253?
parent process is runing
prent pid : 32253, chind pid : 32254?
child process is runing
i : 5
prent pid : 30478, chind pid : 32253?
parent process is runing
i : 3
prent pid : 32253, chind pid : 32254?
child process is runing
i : 4
prent pid : 30478, chind pid : 32253?
parent process is runing
i : 2
prent pid : 32253, chind pid : 32254?
child process is runing
i : 3
prent pid : 30478, chind pid : 32253?
parent process is runing
i : 1
i : 2
prent pid : 30478, chind pid : 32253?
parent process is runing
i : 1
孤兒進程是指父進程執(zhí)行完畢后,父進程被kill這時子進程的getppid()返回的父進程的pid為1,這時子進程就成為孤兒了。孤兒進程由init里程收養(yǎng)。成為init的子進程。init的pid為1。
process.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
? ? pid_t ? pid;
? ? pid ? ? =fork();
? ? switch(pid)
? ? {
? ? ? ? case 0:
? ? ? ? ? ? while(1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? printf("a background process, PID : %d, parentID : %d\n", getpid(), getppid());
? ? ? ? ? ? ? ? sleep(1);
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case 1:
? ? ? ? ? ? printf("create child process faild!\n");
? ? ? ? ? ? break;
? ? ? ? default:
? ? ? ? ? ? printf("I am parent proccess, my pid is %d \n", getpid());
? ? ? ? ? ? break;
? ? }
? ? return 0;
}
#cc process.c -o process -g
#./process
a background process, PID : 836, parentID : 835
I am parent proccess, my pid is 835?
#a background process, PID : 836, parentID : 1
a background process, PID : 836, parentID : 1
a background process, PID : 836, parentID : 1
a background process, PID : 836, parentID : 1
a background process, PID : 836, parentID : 1
a background process, PID : 836, parentID : 1
a background process, PID : 836, parentID : 1
a background process, PID : 836, parentID : 1
這個程序運行后會一直執(zhí)行, 這時可以打開另一個shell,用kill命令來kill它。
子進程與父進程相同的點主要有:相同的用戶ID,相同的組ID。當前的工作目錄,根目錄,打開的文件,創(chuàng)建文件時使用的屏蔽字,信號屏蔽字,上下文環(huán)境,共享的存儲段,資源限制....。
總結(jié)
- 上一篇: sigaction函数使用实例
- 下一篇: 特殊设备文件