在C语言中,管道可以通过Unix的标准函数`pipe()`来创建和使用。以下是一个简单的示例代码,展示了如何创建管道并在父子进程间进行通信:
```c
include include include int main() { int pipefd; // 用于存储管道的文件描述符 char buffer; // 创建管道 if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } // 创建子进程 pid_t pid = fork(); if (pid == -1) { perror("fork"); exit(EXIT_FAILURE); } // 在子进程中 if (pid == 0) { // 关闭读端 close(pipefd); // 从标准输入读取数据并写入管道 read(STDIN_FILENO, buffer, sizeof(buffer) - 1); buffer[strcspn(buffer, "\n")] = 0; // 去掉换行符 write(pipefd, buffer, strlen(buffer)); // 关闭写端 close(pipefd); exit(EXIT_SUCCESS); } else { // 在父进程中 // 关闭写端 close(pipefd); // 从管道读取数据 read(pipefd, buffer, sizeof(buffer) - 1); buffer[strcspn(buffer, "\n")] = 0; // 去掉换行符 printf("子进程说: %s\n", buffer); // 关闭读端 close(pipefd); exit(EXIT_SUCCESS); } } ``` 解释 使用`pipe(pipefd)`函数创建一个管道,`pipefd`是一个长度为2的整数数组,包含两个文件描述符,分别用于读和写。 使用`fork()`函数创建子进程,子进程会继承父进程的管道文件描述符。 在父进程中关闭写端,在子进程中关闭读端。 在子进程中,从标准输入读取数据并写入管道;在父进程中,从管道读取数据并打印。 示例 在上述示例中,程序从标准输入读取一行文本,通过管道传递给子进程,子进程读取后打印出来。父进程和子进程通过关闭不需要的文件描述符来避免潜在的资源泄漏。 进一步应用 管道可以用于更复杂的进程间通信场景,例如将多个程序连接起来形成一个处理流水线。通过这种方式,可以实现数据的有序处理和传递。 注意事项 管道是半双工的,数据只能在一个方向上流动。 管道在进程终止后会自动关闭。 使用管道时需要注意文件描述符的管理,避免资源泄漏。创建管道:
创建子进程:
关闭不需要的文件描述符:
读写管道: