面试题答案
一键面试在Linux环境中使用C语言创建多进程的基本流程如下:
- 包含头文件:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
stdio.h
用于标准输入输出,unistd.h
提供了很多POSIX操作系统API的函数定义,sys/types.h
定义了一些基本系统数据类型。
- 使用
fork()
函数创建子进程:
pid_t pid = fork();
fork()
函数由内核调用,用于创建一个新进程,称为子进程。该函数在父进程和子进程中都返回。在父进程中,fork()
返回子进程的进程ID(大于0);在子进程中,fork()
返回0;如果创建失败,fork()
返回 -1。
- 根据
fork()
的返回值进行不同处理:
if (pid < 0) {
perror("fork error");
return 1;
} else if (pid == 0) {
// 子进程代码段
printf("This is child process, pid = %d\n", getpid());
} else {
// 父进程代码段
printf("This is parent process, pid = %d, child pid = %d\n", getpid(), pid);
}
在子进程中,通常会执行一些与父进程不同的任务,比如加载并执行另一个程序(使用 exec
系列函数)。父进程则可以选择等待子进程结束(使用 wait
或 waitpid
函数),或者继续执行自己的任务。
- 父进程等待子进程结束(可选但常用):
int status;
pid_t wpid = waitpid(pid, &status, 0);
if (wpid == -1) {
perror("waitpid error");
return 1;
}
if (WIFEXITED(status)) {
printf("Child exited with status %d\n", WEXITSTATUS(status));
}
waitpid()
函数用于等待指定子进程结束。pid
是要等待的子进程的ID,status
用于获取子进程的退出状态。WIFEXITED(status)
宏用于判断子进程是否正常退出,WEXITSTATUS(status)
宏用于获取子进程正常退出时的返回值。
主要函数及其作用总结:
fork()
:创建一个新的子进程,该子进程几乎是父进程的一个副本,继承父进程的大部分资源。waitpid()
:等待指定的子进程结束,并获取其退出状态。可以防止父进程在子进程结束前就退出,避免产生僵尸进程。getpid()
:获取当前进程的进程ID。在父进程和子进程中调用该函数,会分别返回父进程和子进程的进程ID。