Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101504
  • 博文数量: 14
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 206
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-28 09:37
个人简介

记录我自己的成长....

文章分类

全部博文(14)

文章存档

2014年(2)

2013年(12)

我的朋友

分类: LINUX

2013-09-26 14:09:36

1,创建有命管道
   创建命名管道的系统调用是mkfifo
   #include
   #include
   int mkfifo(const char *pathname, mode_t mode);
   mkfifo()创建一个命名管道,名字有pathname指定,mode指定了被创建管道的权限,它的权限根据umaks的不同而有所改变,它的
   权限是(mode&~umask).
2,一旦命名管道被创建,就可以像普通文件一样操作它,并且在文件系统中也确实存在这个文件,可用通过ls命令来查看文件.命名管道的
   打开用系统调用open,与普通文件不同,对于一个进程来将,不能对管道既读又写,也就是open的flags参数不能设置为O_RDWR.
3,示例代码:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <string.h>
  5. #include <limits.h>

  6. #define PIPE_NAME "/tmp/inoutput"
  7. int main(void)
  8. {
  9.   int fdes;
  10.   pid_t pid;
  11.   char buf[PIPE_BUF];

  12.   memset(buf, '\0', sizeof(buf));
  13.   //create named pipe
  14.   if (access(PIPE_NAME, F_OK) == -1) {
  15.     //realay create
  16.     if ( mkfifo(PIPE_NAME, 0777)) {
  17.       perror("fail to mkfifo:");
  18.       return -1;
  19.     }
  20.   }
  21.   pid = fork();
  22.   switch (pid) {
  23.   case -1:
  24.     perror("fail to fork:");
  25.     return -1;
  26.   case 0: //child
  27.     fdes = open(PIPE_NAME, O_RDONLY);
  28.     if (fdes < 0) {
  29.       perror("fail to open:");
  30.       return -1;
  31.     }
  32.     read(fdes, buf, 11);
  33.     printf("read form parent: %s\n", buf);
  34.     break;
  35.   default:
  36.     fdes = open(PIPE_NAME, O_WRONLY);
  37.     if (fdes < 0) {
  38.       perror("fail to open:");
  39.       return -1;
  40.     }
  41.     write(fdes, "hello child", 11);
  42.     break;
  43.   }
  44.   return 0;
  45. }

代码可以从此处下载:  名字为namepipe.tar.bz2
阅读(1868) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~