Linux操作系統是一種多任務、多用戶的操作系統,這意味著它可以同時運行多個進程,每個進程都可以執行不同的任務。 在本文中,我們將介紹如何在Linux系統中創建和銷毀進程。 進程的創建 在Linux系統中,進程的創建可以通過fork()系統調用來實現。 fork()函數將當前進程複製一份,創建一個新 ...
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()系統調用來實現。
以上,如果覺得對你有幫助,點個贊再走吧,這樣@知微之見也有更新下去的動力!
也歡迎私信我,一起交流!