Linux进程间通信学习:如何使用匿名管道
发布时间:2016-01-16 04:18:45 所属栏目:Linux 来源:网络整理
导读:在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值。这里将介绍另一种进程间通信的方式匿名管
2、不要用file_descriptor[0]写数据,也不要用file_descriptor[1]读数据,其行为未定义的,但在有些系统上可能会返回-1表示调用失败。数据只能从file_descriptor[0]中读取,数据也只能写入到file_descriptor[1],不能倒过来。 例子: 首先,我们在原先的进程中创建一个管道,然后再调用fork创建一个新的进程,最后通过管道在两个进程之间传递数据。源文件名为pipe.c,代码如下: #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> int main() { int data_processed = 0; int filedes[2]; const char data[] = "Hello pipe!"; char buffer[BUFSIZ + 1]; pid_t pid; //清空缓冲区 memset(buffer, ' ', sizeof(buffer)); if(pipe(filedes) == 0) { //创建管道成功 //通过调用fork创建子进程 pid = fork(); if(pid == -1) { fprintf(stderr, "Fork failure"); exit(EXIT_FAILURE); } if(pid == 0) { //子进程中 //读取数据 data_processed = read(filedes[0], buffer, BUFSIZ); printf("Read %d bytes: %sn", data_processed, buffer); exit(EXIT_SUCCESS); } else { //父进程中 //写数据 data_processed = write(filedes[1], data, strlen(data)); printf("Wrote %d bytes: %sn", data_processed, data); //休眠2秒,主要是为了等子进程先结束,这样做也只是纯粹为了输出好看而已 //父进程其实没有必要等等子进程结束 sleep(2); exit(EXIT_SUCCESS); } } exit(EXIT_FAILURE); } 运行结果为: 可见,子进程读取了父进程写到filedes[1]中的数据,如果在父进程中没有sleep语句,父进程可能在子进程结束前结束,这样你可能将看到两个输入之间有一个命令提示符分隔。 (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |