在Linux系统中,进程间通信(IPC)是一种允许不同进程之间交换数据和信息的机制,常见的IPC方式包括管道、消息队列、共享内存、信号量和套接字等,下面是一个简单的示例程序,演示了如何使用管道进行进程间通信。
这个示例程序包含两个部分:父进程和子进程,父进程创建一个管道,然后创建子进程,子进程通过管道向父进程发送一条消息,父进程读取并打印这条消息。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int main() { int pipefd[2]; // 用于存储管道的文件描述符 pid_t cpid; // 子进程的PID char buf; // 缓冲区,用于读取数据 char message[] = "Hello from child process!"; // 创建管道 if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } // 创建子进程 cpid = fork(); if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); } if (cpid == 0) { // 子进程 close(pipefd[0]); // 关闭读端 write(pipefd[1], message, strlen(message)); // 写入消息到管道 close(pipefd[1]); // 关闭写端 exit(EXIT_SUCCESS); } else { // 父进程 close(pipefd[1]); // 关闭写端 while (read(pipefd[0], &buf, 1) > 0) { // 从管道读取数据 write(STDOUT_FILENO, &buf, 1); // 将数据写到标准输出 } write(STDOUT_FILENO, "\n", 1); // 换行 close(pipefd[0]); // 关闭读端 wait(NULL); // 等待子进程结束 exit(EXIT_SUCCESS); } }
代码解释:
1、创建管道:使用pipe(pipefd)
函数创建一个管道,pipefd
数组中保存了两个文件描述符,pipefd[0]
用于读取,pipefd[1]
用于写入。
2、创建子进程:使用fork()
函数创建一个子进程,如果返回值为0,表示当前是子进程;否则是父进程。
3、子进程操作:
关闭管道的读端pipefd[0]
。
使用write()
函数将消息写入管道的写端pipefd[1]
。
关闭写端pipefd[1]
。
4、父进程操作:
关闭管道的写端pipefd[1]
。
使用read()
函数从管道的读端pipefd[0]
读取数据,并将其写到标准输出。
关闭读端pipefd[0]
。
使用wait()
函数等待子进程结束。
这个简单的示例展示了如何使用管道在父子进程之间传递消息,根据实际需求,可以选择其他IPC机制来实现更复杂的进程间通信。