Linux進程的創建與銷毀
Linux操作系統是一種多任務、多用戶的操作系統,這意味著它可以同時運行多個進程,每個進程都可以執行不同的任務。
在本文中,我們將介紹如何在Linux系統中創建和銷毀進程。
進程的創建
在Linux系統中,進程的創建可以通過fork()系統調用來實現。
fork()函數將當前進程復制一份,創建一個新的進程。
新進程的代碼、數據和堆棧等信息都是從原進程復制而來的。fork()函數返回兩個值,對于父進程,它返回子進程的進程ID(PID),對于子進程,它返回0。
下面是一個使用fork()函數創建子進程的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());
// 這里是子進程的代碼
} else {
printf("I am the parent process %d, child PID is %d.\n",getpid(),pid);
// 這里是父進程的代碼
}
return 0;
}
運行編譯好的程序,打印信息如下
I am the parent process 3891, child PID is 3892.
I am the child process 3892. parent PID is 3891.
在這個程序中,我們首先聲明了一個pid_t類型的變量pid,它用于存儲fork()函數的返回值。接著,我們調用fork()函數,并根據返回值判斷當前是父進程還是子進程。如果返回值為-1,說明fork()函數調用失敗,程序將直接退出。如果返回值為0,說明當前是子進程,程序將執行子進程的代碼。否則,說明當前是父進程,程序將執行父進程的代碼。
進程的銷毀
在Linux系統中,進程的銷毀可以通過exit()系統調用來實現。exit()函數將當前進程終止,并返回一個退出狀態。如果進程沒有調用exit()函數而直接退出,系統會自動調用exit()函數。
下面是一個使用exit()函數終止進程的C語言程序:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
// 創建子進程
pid = fork();
if (pid < 0) {
fprintf(stderr, "創建子進程失敗\n");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 子進程代碼
printf("子進程開始執行,PID is %d.\n",getpid());
sleep(10);
printf("子進程執行完畢\n");
exit(EXIT_SUCCESS);
} else {
// 父進程代碼
printf("父進程開始執行\n");
sleep(5);
printf("父進程執行完畢\n");
// 等待子進程結束
int status;
waitpid(pid, &status, 0);
if (WIFEXITED(status)) {
printf("子進程正常結束,退出狀態為%d\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("子進程被信號中斷,信號編號為%d\n", WTERMSIG(status));
} else {
printf("子進程其他未知狀態\n");
}
}
return 0;
}
該程序首先使用fork()函數創建一個子進程,并在子進程中執行一些操作,然后父進程等待一段時間后結束,并使用waitpid()函數等待子進程結束。子進程在執行完畢后調用exit()函數退出。在父進程中,可以通過waitpid()函數獲取子進程的退出狀態。最后,程序結束并返回0。
- 編譯后運行程序,正常運行打印信息如下
父進程開始執行
子進程開始執行,PID is 4013.
父進程執行完畢
子進程執行完畢
子進程正常結束,退出狀態為0
- 運行后,終端輸入kill - 9 4015 強制結束子進程,打印如下
父進程開始執行
子進程開始執行,PID is 4015.
父進程執行完畢
子進程被信號中斷,信號編號為9
小結
在Linux系統中,進程的創建可以通過fork()系統調用來實現,進程的銷毀可以通過exit()系統調用來實現。
以上,如果覺得對你有幫助,點個贊再走吧,這樣@知微之見也有更新下去的動力!
也歡迎私信我,一起交流!

浙公網安備 33010602011771號