Fork 是 Unix 和类 Unix 操作系统(如 Linux)中的一个系统调用,用于创建一个新的进程。新进程被称为子进程,而创建它的进程被称为父进程。子进程几乎是父进程的一个完整副本,包括代码、数据、堆栈以及打开的文件描述符。
PID(Process ID) 是操作系统分配给每个进程的唯一标识符。每个进程都有一个唯一的 PID,可以通过 ps
命令或其他系统工具查看。
在 Linux 中,fork 主要有两种类型:
clone
系统调用可以创建具有特定共享属性的子进程,如共享内存、文件系统信息等。在父进程中,可以通过 waitpid
或 wait
系统调用来等待子进程结束,并获取子进程的 PID。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main() {
pid_t pid = fork();
if (pid < 0) {
perror("fork failed");
return 1;
} else if (pid == 0) {
// 子进程
printf("子进程 PID: %d\n", getpid());
} else {
// 父进程
printf("父进程 PID: %d, 子进程 PID: %d\n", getpid(), pid);
wait(NULL); // 等待子进程结束
}
return 0;
}
僵尸进程是指已经结束但父进程还没有调用 wait
或 waitpid
来获取其退出状态的子进程。可以通过以下方法避免:
wait
或 waitpid
:及时获取子进程的退出状态。wait
。#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
void sigchld_handler(int signum) {
while (waitpid(-1, NULL, WNOHANG) > 0);
}
int main() {
signal(SIGCHLD, sigchld_handler);
pid_t pid = fork();
if (pid < 0) {
perror("fork failed");
return 1;
} else if (pid == 0) {
// 子进程
printf("子进程 PID: %d\n", getpid());
sleep(2);
return 0;
} else {
// 父进程
printf("父进程 PID: %d, 子进程 PID: %d\n", getpid(), pid);
sleep(5); // 父进程等待一段时间
}
return 0;
}
守护进程通常在后台运行,不与终端交互。创建守护进程的步骤包括:
fork
并退出父进程:确保守护进程不是进程组的领导者。setsid
:创建新的会话,成为会话领导者。fork
并退出:确保守护进程不会重新获得控制终端。0
。/
。#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void daemonize() {
pid_t pid;
// 第一步:fork 并退出父进程
pid = fork();
if (pid < 0) {
perror("fork failed");
exit(1);
}
if (pid > 0) {
exit(0);
}
// 第二步:创建新会话
if (setsid() < 0) {
perror("setsid failed");
exit(1);
}
// 第三步:再次 fork 并退出
pid = fork();
if (pid < 0) {
perror("fork failed");
exit(1);
}
if (pid > 0) {
exit(0);
}
// 第四步:设置文件权限掩码
umask(0);
// 第五步:更改工作目录
if (chdir("/") < 0) {
perror("chdir failed");
exit(1);
}
// 第六步:关闭不必要的文件描述符
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
}
int main() {
daemonize();
// 守护进程代码
while (1) {
sleep(1);
}
return 0;
}
通过以上内容,你应该对 Linux 中的 fork 和 PID 有了更深入的了解,并能够解决常见的相关问题。
领取专属 10元无门槛券
手把手带您无忧上云