无名管道(unnamed pipe)是一种进程间通信的方式,通常用于父子进程之间的通信。下面是使用无名管道的基本步骤:
pipe
调用的返回值如下:
- 成功时:
pipe
调用成功时返回 0。 - 失败时:如果
pipe
调用失败,返回 -1,并设置errno
以指示错误原因。errno
可能被设置为以下几种值之一:EBADF
:文件描述符不正确。EACCES
:没有权限创建管道。EMFILE
:进程已经达到了它能够打开的文件描述符的最大数量。ENFILE
:系统已经达到了能够打开的文件的最大数量。ENOMEM
:没有足够的内核内存资源来创建管道。
- 创建一个无名管道:使用 pipe() 函数创建一个无名管道,它会返回两个文件描述符,fd[0] 用于读取数据,fd[1] 用于写入数据。
int fd[2];
pipe(fd);
- 创建子进程:使用 fork() 函数创建一个子进程,子进程会继承父进程的文件描述符。
pid_t pid = fork();
- 在父进程中写入数据:如果当前是父进程,则可以使用 fd[1] 来写入数据到无名管道。
if (pid > 0) {close(fd[0]); // 关闭读取端write(fd[1], data, sizeof(data));close(fd[1]); // 关闭写入端
}
- 在子进程中读取数据:如果当前是子进程,则可以使用 fd[0] 来读取从父进程写入的数据。
if (pid == 0) {close(fd[1]); // 关闭写入端read(fd[0], buffer, sizeof(buffer));close(fd[0]); // 关闭读取端
}
注意事项:
- 父进程和子进程在使用无名管道时需要关闭不使用的一端,以避免造成不必要的阻塞。
- 无名管道是一个单向通道,数据只能单向流动,需要双向通信时可以创建两个无名管道。
- 无名管道只能在具有共同祖先的进程之间使用。
- 无名管道的大小是有限的,一般为 65536 字节,超过该大小的数据会被截断。
这是一个简单的示例,请根据实际情况进行相应的修改和扩展。
//无名管道(pipe)
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
int main(void){int fd[2];//两个管道char buf[100];//用于存储发送和接收的内容if(pipe(fd)<0){//管道失败的话perror( "pipe");exit(1);}printf("无名管道开始\n");pid_t fork_ret=fork();if(fork_ret<0){perror("fork()");return -1; }else if(fork_ret==0){while(1){bzero(buf,sizeof(buf));printf("\n大好儿:PID:%d PPID:%d\n\n",getpid(),getppid());read(fd[0],buf,sizeof(buf));printf("呀 是 爹!!发来的:%s \n",buf);if( strncmp(buf,"quit",4) == 0){ break;}}}else{while(1){bzero(buf,sizeof(buf));printf("爹:PID:%d PPID:%d\n",getpid(),getppid());fgets(buf,sizeof(buf),stdin);printf("向大好儿发送:%s \n\n",buf);write(fd[1],buf,strlen(buf));if( strncmp(buf,"quit",4) == 0){ break;} } }return 0;
}
:se