一、pid_t概述
在Linux系統中,每一個進程都會擁有一個唯一的進程ID(PID)來標識自己。PID是一個數字,用於唯一識別一個正在運行的進程。PID也可以用於進程之間的相互通信。在Linux系統中,pid_t是一個數據類型,用於存儲PID的值。
在C語言中,pid_t被定義在頭文件中。其數據範圍是-2147483648到2147483647,可以存儲任意一個進程的PID值。
pid_t getpid(void);
pid_t getppid(void);
二、獲取進程ID和父進程ID
可以使用getpid()函數獲取當前進程的PID值,使用getppid()函數獲取當前進程的父進程PID值。
#include<stdio.h>
#include<unistd.h>
int main(){
pid_t pid, ppid;
pid = getpid();
ppid = getppid();
printf("My process ID is %d\n", pid);
printf("My parent process ID is %d\n", ppid);
return 0;
}
運行上述代碼,將會輸出當前進程的PID值和父進程PID值。
三、創建和管理子進程
在Linux系統中,一個進程可以通過fork()系統調用創建一個子進程。fork()會在當前進程的地址空間中複製一份,但是子進程會從fork()之後的代碼開始執行。除了PID不同之外,子進程和父進程是完全獨立的進程。
以下是fork()函數的原型:
#include<unistd.h>
pid_t fork(void);
在父進程中,fork()的返回值是新創建進程的PID;在子進程中,fork()的返回值是0。如果fork()返回-1,則表示創建新進程失敗。
四、進程等待和退出
使用wait()函數可以使父進程等待子進程的退出。在子進程結束時,會返回一個退出狀態碼。如果父進程在子進程退出之前先執行結束,子進程就會成為一個殭屍進程。為了避免這種情況,我們可以使用wait()來等待子進程結束。
#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<unistd.h>
int main()
{
pid_t pid;
int status;
pid=fork();//創建子進程
if(pid==-1){
perror("fork");
exit(1);
}else if(pid==0){ // 子進程執行
printf("This is child process with pid %d\n",getpid());
exit(0);
}else{ // 父進程執行
printf("This is parent process with pid %d\n",getpid());
wait(&status); // 等待子進程結束
printf("The child process with pid %d exited with status %d.\n",pid, WEXITSTATUS(status));//獲取子進程退出狀態碼
}
return 0;
}
五、進程的信號處理
進程可以通過信號來通知其他進程發生了某個事件。例如,向進程發送SIGKILL信號將殺死該進程。可以使用signal()函數來設置信號的處理方式。
#include<signal.h>
#include<stdio.h>
#include<unistd.h>
void signal_handler(int signum)
{
printf("Received signal %d\n", signum);
}
int main()
{
signal(SIGINT, signal_handler);//設置SIGINT信號的處理方式
while(1){
printf("Waiting for signal...\n");
sleep(1);
}
return 0;
}
運行上述代碼,在運行過程中按下Ctrl+C的組合鍵,將會觸發SIGINT信號的處理方式,輸出”Received signal 2″。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/200652.html