MST

星途 面试题库

面试题:C语言在Linux下多进程创建的基本步骤

请简述在Linux环境中,使用C语言创建多进程的基本流程,包括涉及到的主要函数及其作用。
35.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

在Linux环境中使用C语言创建多进程的基本流程如下:

  1. 包含头文件
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

stdio.h 用于标准输入输出,unistd.h 提供了很多POSIX操作系统API的函数定义,sys/types.h 定义了一些基本系统数据类型。

  1. 使用 fork() 函数创建子进程
pid_t pid = fork();

fork() 函数由内核调用,用于创建一个新进程,称为子进程。该函数在父进程和子进程中都返回。在父进程中,fork() 返回子进程的进程ID(大于0);在子进程中,fork() 返回0;如果创建失败,fork() 返回 -1。

  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 系列函数)。父进程则可以选择等待子进程结束(使用 waitwaitpid 函数),或者继续执行自己的任务。

  1. 父进程等待子进程结束(可选但常用)
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。