MST

星途 面试题库

面试题:C语言中Linux prefork模型如何初始化子进程

请描述在Linux环境下,使用C语言实现prefork模型时,初始化子进程的关键步骤和涉及的主要函数。并举例说明如何对子进程进行简单的资源分配和初始化设置。
10.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

初始化子进程的关键步骤及主要函数

  1. 创建子进程
    • 使用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 {
        // 父进程代码
    }
    
  2. 子进程资源分配与初始化设置
    • 关闭不必要的文件描述符:父进程中打开的一些文件描述符对于子进程可能不需要,例如监听套接字(如果子进程不负责监听)。可以使用close()函数关闭,close(int fd),其中fd是要关闭的文件描述符。
    • 设置进程属性
      • 更改工作目录:使用chdir(const char *path)函数,例如将子进程工作目录更改为/tmpchdir("/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,设置了文件权限掩码,然后在新的工作目录下创建了一个文件并写入内容。