您的位置:

如何使用pid_t在Linux系统中进行进程管理

一、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"。