一、pid_t概述
在Linux系统中,每一个进程都会拥有一个唯一的进程ID(PID)来标识自己。PID是一个数字,用于唯一识别一个正在运行的进程。PID也可以用于进程之间的相互通信。在Linux系统中,pid_t是一个数据类型,用于存储PID的值。
在C语言中,pid_t被定义在
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"。