免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2546 | 回复: 2

[Linux] 管道关闭读或写意味着什么? [复制链接]

论坛徽章:
2
摩羯座
日期:2014-10-28 18:18:322015元宵节徽章
日期:2015-03-06 15:52:30
发表于 2015-10-03 11:00 |显示全部楼层
关于管道我有几个疑问,还望大家指教。
1. APUE中说“管道只能在具有公共祖先的两个进程之间使用”,为什么?
2. 在一个进程中关闭管道的读端(或写端),另一个进程使用相同的描述符仍可以读(或写),这是为什么?同样的描述符在两个进程中代表什么呢?
3. 在一个进程中,如下的代表为什么没有产生SIGPIPE信号。
        close(fd[0]);
        close(fd[1]);
        printf("fd[0]: %d; fd[1]: %d\n", fd[0], fd[1]);
        write(fd[1], "hello world\n", 12);
     完整的代码如下:
   
void sigpipe_cb(int signo)
{
    printf("Sig num: %d\n", signo);
}

  1. void sigpipe_cb(int signo)
  2. {
  3.     printf("Sig num: %d\n", signo);
  4. }

  5. int main()
  6. {
  7.     int n;
  8.     int fd[2];
  9.     pid_t pid;
  10.     char line[256];
  11.     signal(SIGPIPE, sigpipe_cb);
  12.     if (pipe(fd) < 0)
  13.         return -1;
  14.     printf("fd[0]: %d; fd[1]: %d\n", fd[0], fd[1]);
  15.     if ((pid = fork()) < 0) {
  16.         return -1;
  17.     }
  18.     else if (pid > 0) {
  19.         close(fd[0]);
  20.         close(fd[1]);
  21.         printf("fd[0]: %d; fd[1]: %d\n", fd[0], fd[1]);
  22.         write(fd[1], "hello world\n", 12);
  23.     }
  24.     else {
  25.         close(fd[0]);
  26.         close(fd[1]);
  27.         printf("fd[0]: %d; fd[1]: %d\n", fd[0], fd[1]);
  28.         n = read(fd[0], line, 256);
  29.         write(1, line, n);
  30.     }
  31.     exit(0);
  32. }
复制代码

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:29:50
发表于 2015-10-06 23:27 |显示全部楼层
你都把fd[1] close 了,,程序还能write??  难道没有报错?

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
发表于 2015-10-10 14:27 |显示全部楼层
1. APUE中说“管道只能在具有公共祖先的两个进程之间使用”,为什么?
因为他们要共用一组(继承自父进程的)管道文件,进行通信;继承父进程是最简单的方法。

2. 在一个进程中关闭管道的读端(或写端),另一个进程使用相同的描述符仍可以读(或写),这是为什么?同样的描述符在两个进程中代表什么呢?
进程 A 的写 对应的进程 B 的读,进程A的读对应的进程B的写;
    A fd[1]  --> B fd[0]    # A写 B读
    A fd[0]  <-- B fd[1]    # B写 A读
  如果是单向的数据操作 A -> B;当然就是把 A 的读 B 的写关掉了
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>

  4. int main(void)
  5. {
  6.         int     fd[2], nbytes;
  7.         pid_t   childpid;
  8.         char    string[] = "Hello, world!\n";
  9.         char    readbuffer[80];

  10.         pipe(fd);
  11.         
  12.         if((childpid = fork()) == -1)
  13.         {
  14.                 perror("fork");
  15.                 exit(1);
  16.         }

  17.         if(childpid == 0)
  18.         {
  19.                 /* Child process closes up input side of pipe */
  20.                 close(fd[0]);

  21.                 /* Send "string" through the output side of pipe */
  22.                 write(fd[1], string, (strlen(string)+1));
  23.                 exit(0);
  24.         }
  25.         else
  26.         {
  27.                 /* Parent process closes up output side of pipe */
  28.                 close(fd[1]);

  29.                 /* Read in a string from the pipe */
  30.                 nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
  31.                 printf("Received string: %s", readbuffer);
  32.         }
  33.         
  34.         return(0);
  35. }
复制代码
3. 管道破裂,是一端还在读或写,另一端确关闭了;你的代码里把所有的都关掉了,读写syscall返回错误,不会发任何信号
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP