Chinaunix首页 | 论坛 | 博客
  • 博客访问: 88210
  • 博文数量: 60
  • 博客积分: 4002
  • 博客等级: 中校
  • 技术积分: 645
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 18:11
文章分类

全部博文(60)

文章存档

2011年(60)

我的朋友

分类: LINUX

2011-01-19 20:18:55

    管道是UNIX系统IPC的最古老的形式。她有两种局限性:
    1:半双工    2:只能在具有公共祖先的进程之间使用

    管道是由pipe函数创建的:
    #include
    int pipe(int filedes[2]);      //成功返回0,失败返回-1

    filedes[0] : 为读而打开    filedes[1] :为写而打开

    可以想象一下:管道就像一个爸爸和儿子之间玩游戏时的通道,爸爸进入通道找儿子,儿子从通道跑出来躲爸爸。

    1:当管道写端被关闭后, 所有数据被读取后,read返回0 表示文件结束
    2:当管道读端被关闭后, 写数据时则产生信号SIGPIPE, write返回-1,errno 设置为 EPIPE.

    管道在内核空间中创建, PIPE_BUF 规定内核中管道缓冲区的大小。

例:
  1. #include <stdio.h>
  2. #include <unistd.h>

  3. #define MAXLINE    128

  4. int
  5. main(void)
  6. {
  7.     int    n;
  8.     int    fd[2];
  9.     pid_t    pid;
  10.     char    line[MAXLINE];

  11.     if (pipe(fd) < 0) {
  12.         printf("pipe error\n");
  13.     }
  14.     if ((pid = fork()) < 0) {
  15.         printf("fork error\n");
  16.     } else if (pid > 0) {
  17.         close(fd[0]);
  18.         write(fd[1], "hello world\n", 12);
  19.         } else {
  20.             close(fd[1]);
  21.             n = read(fd[0], line, MAXLINE);
  22.             write(STDOUT_FILENO, line, n);
  23.         }

  24.     return 0;
  25. }
注:fork 函数被调用一次, 但返回两次。子进程返回0,父进程返回新子进程的ID。



阅读(829) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~