加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux进程间通信学习:如何使用匿名管道

发布时间:2016-05-22 05:10:03 所属栏目: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);  
}

运行结果为:

Linux进程间通信学习:如何使用匿名管道

可见,子进程读取了父进程写到filedes[1]中的数据,如果在父进程中没有sleep语句,父进程可能在子进程结束前结束,这样你可能将看到两个输入之间有一个命令提示符分隔。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读