Linux操作系統(tǒng)是一種多任務(wù)盛嘿、多用戶的操作系統(tǒng),這意味著它可以同時運(yùn)行多個進(jìn)程坡贺,每個進(jìn)程都可以執(zhí)行不同的任務(wù)。
在本文中箱舞,我們將介紹如何在Linux系統(tǒng)中創(chuàng)建和銷毀進(jìn)程遍坟。
進(jìn)程的創(chuàng)建
在Linux系統(tǒng)中,進(jìn)程的創(chuàng)建可以通過fork()系統(tǒng)調(diào)用來實(shí)現(xiàn)褐缠。
fork()函數(shù)將當(dāng)前進(jìn)程復(fù)制一份政鼠,創(chuàng)建一個新的進(jìn)程。
新進(jìn)程的代碼队魏、數(shù)據(jù)和堆棧等信息都是從原進(jìn)程復(fù)制而來的公般。fork()函數(shù)返回兩個值万搔,對于父進(jìn)程,它返回子進(jìn)程的進(jìn)程ID(PID)官帘,對于子進(jìn)程瞬雹,它返回0。
下面是一個使用fork()函數(shù)創(chuàng)建子進(jìn)程的C語言程序:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t pid;
pid = fork();
if (pid == -1) {
printf("Failed to fork.\n");
return 1;
}
if (pid == 0) {
printf("I am the child process %d. parent PID is %d.\n", getpid(),getppid());
// 這里是子進(jìn)程的代碼
} else {
printf("I am the parent process %d, child PID is %d.\n",getpid(),pid);
// 這里是父進(jìn)程的代碼
}
return 0;
}
運(yùn)行編譯好的程序刽虹,打印信息如下
I am the parent process 3891, child PID is 3892.
I am the child process 3892. parent PID is 3891.
在這個程序中酗捌,我們首先聲明了一個pid_t類型的變量pid,它用于存儲fork()函數(shù)的返回值涌哲。接著胖缤,我們調(diào)用fork()函數(shù),并根據(jù)返回值判斷當(dāng)前是父進(jìn)程還是子進(jìn)程阀圾。如果返回值為-1哪廓,說明fork()函數(shù)調(diào)用失敗,程序?qū)⒅苯油顺龀鹾妗H绻祷刂禐?涡真,說明當(dāng)前是子進(jìn)程,程序?qū)?zhí)行子進(jìn)程的代碼肾筐。否則哆料,說明當(dāng)前是父進(jìn)程,程序?qū)?zhí)行父進(jìn)程的代碼吗铐。
進(jìn)程的銷毀
在Linux系統(tǒng)中东亦,進(jìn)程的銷毀可以通過exit()系統(tǒng)調(diào)用來實(shí)現(xiàn)。exit()函數(shù)將當(dāng)前進(jìn)程終止唬渗,并返回一個退出狀態(tài)讥此。如果進(jìn)程沒有調(diào)用exit()函數(shù)而直接退出,系統(tǒng)會自動調(diào)用exit()函數(shù)谣妻。
下面是一個使用exit()函數(shù)終止進(jìn)程的C語言程序:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
// 創(chuàng)建子進(jìn)程
pid = fork();
if (pid < 0) {
fprintf(stderr, "創(chuàng)建子進(jìn)程失敗\n");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 子進(jìn)程代碼
printf("子進(jìn)程開始執(zhí)行,PID is %d.\n",getpid());
sleep(10);
printf("子進(jìn)程執(zhí)行完畢\n");
exit(EXIT_SUCCESS);
} else {
// 父進(jìn)程代碼
printf("父進(jìn)程開始執(zhí)行\(zhòng)n");
sleep(5);
printf("父進(jìn)程執(zhí)行完畢\n");
// 等待子進(jìn)程結(jié)束
int status;
waitpid(pid, &status, 0);
if (WIFEXITED(status)) {
printf("子進(jìn)程正常結(jié)束萄喳,退出狀態(tài)為%d\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("子進(jìn)程被信號中斷,信號編號為%d\n", WTERMSIG(status));
} else {
printf("子進(jìn)程其他未知狀態(tài)\n");
}
}
return 0;
}
該程序首先使用fork()函數(shù)創(chuàng)建一個子進(jìn)程蹋半,并在子進(jìn)程中執(zhí)行一些操作他巨,然后父進(jìn)程等待一段時間后結(jié)束,并使用waitpid()函數(shù)等待子進(jìn)程結(jié)束减江。子進(jìn)程在執(zhí)行完畢后調(diào)用exit()函數(shù)退出染突。在父進(jìn)程中,可以通過waitpid()函數(shù)獲取子進(jìn)程的退出狀態(tài)辈灼。最后份企,程序結(jié)束并返回0。
- 編譯后運(yùn)行程序巡莹,正常運(yùn)行打印信息如下
父進(jìn)程開始執(zhí)行
子進(jìn)程開始執(zhí)行,PID is 4013.
父進(jìn)程執(zhí)行完畢
子進(jìn)程執(zhí)行完畢
子進(jìn)程正常結(jié)束司志,退出狀態(tài)為0
- 運(yùn)行后甜紫,終端輸入kill - 9 4015 強(qiáng)制結(jié)束子進(jìn)程,打印如下
父進(jìn)程開始執(zhí)行
子進(jìn)程開始執(zhí)行,PID is 4015.
父進(jìn)程執(zhí)行完畢
子進(jìn)程被信號中斷骂远,信號編號為9
小結(jié)
在Linux系統(tǒng)中囚霸,進(jìn)程的創(chuàng)建可以通過fork()系統(tǒng)調(diào)用來實(shí)現(xiàn),進(jìn)程的銷毀可以通過exit()系統(tǒng)調(diào)用來實(shí)現(xiàn)激才。
以上拓型,如果覺得對你有幫助,點(diǎn)個贊再走吧瘸恼,這樣@知微之見也有更新下去的動力劣挫!
也歡迎私信我,一起交流东帅!