你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux 进程间通讯之创建无名管道和读写无名管道

[日期:2012-12-22] 来源:Linux社区   作者:liuy5277 [字体: ]

Linux进程间通讯的方式:

1. 管道(pipe)和有名管道(FIFO).
2. 信号(signal)
3. 消息队列
4. 共享内存
5. 信号量
6. 套接字(socket) 

管道通讯:

无名管道:由pipe()函数创建,int pipe(int  filedis[2]), 当管道建立时有两个文件描述符,filedis[0]用于读管道,filedis[1]用于写管道。关闭管道,仅需将两个文件描述符关闭即可。

创建无名管道pipe():

#include <unistd.h>

#include <stdio.h>

 

int main(){

        intpipe_filed[2];

        if(pipe(pipe_filed)<0){

                  printf("pipecreate failed.\n");

                  return-1;

        }

        else{

                  printf("pipecreate successfully.\n");

                  close(pipe_filed[0]);                            //关闭相应读管道(必须要)

                  close(pipe_filed[1]);                            //关闭相应写管道(必须要)

        }

}

注:fork()必须在pipe()之前来创建子进程,否则子进程无法进程相应的文件描述符,如果在fork之后,那么fork会在子/父进程各执行一次,属不同的管道。

读写无名管道示例:

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <sys/wait.h>

 

int main(){

        charcache[100];

        intfiledis[2];

        if(pipe(filedis)< 0){

                  printf("Createpipe failed.\n");

                  return-1;

        }

        memset(cache,0, sizeof(cache));            //在一段内存块中填充某个特定的值,此为,对cache数组以0进行填充

 

        intpid;

        pid= fork();                                            // 创建子进程

        if(pid== 0){                                            //    进入子进程

                  printf("Inchild process.\n");

                  close(filedis[1]);                          //    关闭写管道

                  sleep(3);                                        //    等待,为了等父进程写入东西

                  read(filedis[0],cache, 100);    //    读管道,并将内容写入cache之中

                  printf("%s.\n",cache);              //    打印cache内容

                  close(filedis[0]);                          //    关闭读管道

        }

        elseif(pid > 0){                            //    进入父进程

                  printf("Inparent process.\n");

                  close(filedis[0]);                          //    关闭读管道

                  write(filedis[1],"Hello ",6);    //    第一次写入

                  write(filedis[1],"linuxdba", 8);        //    第二次写入

                  close(filedis[1]);                          //    关闭写管道

                  wait(NULL);                                  //    等待子进程退出再往下执行

        }

        else{

                  printf("Createchild process failed.\n");

                  return-1;

        }

        return0;

}

linux
相关资讯       嵌入式  Linux 无名管道 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款