面试题答案
一键面试初始化子进程的关键步骤及主要函数
- 创建子进程:
- 使用
fork()
函数。fork()
函数会创建一个与父进程几乎完全相同的子进程,父进程和子进程会从fork()
函数调用处开始执行不同的代码分支,父进程中fork()
返回子进程的进程ID,子进程中fork()
返回0。 - 示例代码:
pid_t pid = fork(); if (pid < 0) { perror("fork error"); exit(EXIT_FAILURE); } else if (pid == 0) { // 子进程代码 } else { // 父进程代码 }
- 使用
- 子进程资源分配与初始化设置:
- 关闭不必要的文件描述符:父进程中打开的一些文件描述符对于子进程可能不需要,例如监听套接字(如果子进程不负责监听)。可以使用
close()
函数关闭,close(int fd)
,其中fd
是要关闭的文件描述符。 - 设置进程属性:
- 更改工作目录:使用
chdir(const char *path)
函数,例如将子进程工作目录更改为/tmp
,chdir("/tmp");
。 - 更改文件权限掩码:使用
umask(mode_t mask)
函数,例如设置文件权限掩码为0022,umask(0022);
,这样新创建的文件默认权限会受到掩码影响。
- 更改工作目录:使用
- 关闭不必要的文件描述符:父进程中打开的一些文件描述符对于子进程可能不需要,例如监听套接字(如果子进程不负责监听)。可以使用
示例:子进程进行简单的资源分配和初始化设置
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
int main() {
pid_t pid = fork();
if (pid < 0) {
perror("fork error");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 子进程
// 关闭标准输入,因为子进程可能不需要从终端读取
close(STDIN_FILENO);
// 更改工作目录
if (chdir("/tmp") == -1) {
perror("chdir error");
exit(EXIT_FAILURE);
}
// 设置文件权限掩码
umask(0022);
// 创建一个新文件
int fd = open("child_file.txt", O_CREAT | O_WRONLY, 0644);
if (fd == -1) {
perror("open error");
exit(EXIT_FAILURE);
}
const char *msg = "This is from child process\n";
write(fd, msg, strlen(msg));
close(fd);
printf("Child process is running, pid: %d\n", getpid());
} else {
// 父进程
printf("Parent process, child pid: %d\n", pid);
}
return 0;
}
在这个示例中,子进程关闭了标准输入,更改了工作目录到/tmp
,设置了文件权限掩码,然后在新的工作目录下创建了一个文件并写入内容。