MST

星途 面试题库

面试题:C语言网络编程中多进程间如何进行简单通信

在C语言网络编程结合多进程的场景下,假设已经创建了多个子进程,描述一下使用管道(pipe)进行父子进程间简单通信的步骤,并给出相应的代码示例。
33.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 通信步骤
    • 创建管道:使用pipe函数创建一个管道,该函数会返回两个文件描述符,一个用于读(fd[0]),一个用于写(fd[1])。
    • 创建子进程:通过fork函数创建多个子进程。
    • 关闭不需要的文件描述符
      • 在父进程中,如果只负责向管道写数据,就关闭读端文件描述符fd[0];如果只负责读数据,就关闭写端文件描述符fd[1]
      • 在子进程中,同样根据需要关闭不需要的文件描述符。例如,如果子进程负责读数据,就关闭写端文件描述符fd[1]
    • 数据传输
      • 写数据的进程使用write函数将数据写入管道。
      • 读数据的进程使用read函数从管道读取数据。
    • 关闭管道:通信完成后,关闭所有打开的管道文件描述符。
  2. 代码示例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define BUFFER_SIZE 100

int main() {
    int pipe_fds[2];
    if (pipe(pipe_fds) == -1) {
        perror("pipe creation failed");
        return 1;
    }

    pid_t pid = fork();
    if (pid == -1) {
        perror("fork failed");
        return 1;
    } else if (pid == 0) { // 子进程
        close(pipe_fds[1]); // 子进程关闭写端
        char buffer[BUFFER_SIZE];
        ssize_t bytes_read = read(pipe_fds[0], buffer, sizeof(buffer));
        if (bytes_read == -1) {
            perror("read failed");
            return 1;
        }
        buffer[bytes_read] = '\0';
        printf("子进程读取到的数据: %s\n", buffer);
        close(pipe_fds[0]);
    } else { // 父进程
        close(pipe_fds[0]); // 父进程关闭读端
        const char *message = "Hello from parent!";
        ssize_t bytes_written = write(pipe_fds[1], message, strlen(message));
        if (bytes_written == -1) {
            perror("write failed");
            return 1;
        }
        close(pipe_fds[1]);
        wait(NULL); // 等待子进程结束
    }
    return 0;
}

这段代码创建了一个管道,并通过fork创建了一个子进程。父进程向管道写入数据,子进程从管道读取数据并打印。注意在实际应用中,对于多进程场景,可以根据需求创建多个子进程,并合理分配管道读写任务。