为什么在使用管道的IPC中使用write()而不是print()打印输出两次?

时间:2013-03-12 18:57:16

标签: c linux ipc

我的问题很简单直接。我试图在管道的一端发送数据并尝试从另一端读取。我正在尝试学习IPC机制,我在做这个简单的程序时卡住了。如果我在父进程中使用print()[1],那么

o/p is 

In the child process
IN the parent process and its sleeping
SUBI IS IN LOVE WITH PUTHALATH

但是,如果我在父进程中使用write()[2在下面的程序中评论]

 o/p is 

 In the child process
 IN the parent process and its sleeping
 SUBI IS IN LOVE WITH PUTHALATHIN the parent process and its sleeping

为什么“在父进程及其休眠状态”中的行被打印两次?

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>

int main(){

   int fd[2];
   pipe(fd);

  if(!fork()){
    printf("In the child process\n");
    close(1);
    dup(fd[1]);
    close(fd[0]);
    write(1,"SUBI IS IN LOVE WITH PUTHALATH", 200);

   } else {
      sleep(1);
      printf("IN the parent process and its sleeping \n");
      char* stream;
      close(fd[1]);
       read(fd[0],stream,200);
       printf("%s",stream);------>(1)
      // write(1,stream,200);---->(2)
    }
     return 0;
    }

任何帮助都是因为我被困在这里。

3 个答案:

答案 0 :(得分:0)

  

BUGS

   It is not advisable to mix calls to output functions from the stdio library
   with low-level calls to write(2) for the file descriptor associated with
   the same output stream; the results will be undefined and very probably not
   what you want.

http://man7.org/linux/man-pages/man3/puts.3.html

正如其他人指出的那样,你没有为你的流分配内存..

答案 1 :(得分:0)

在孩子身上,你

write(1,"SUBI IS IN LOVE WITH PUTHALATH", 200);

从字符串文字开始处开始向管道写入200个字节。

当你

write(1,stream,200);
在父级中

(在将内存分配给stream之后),写入子级写入管道的200字节,而printf在0字节处停止,终止字符串文字{{ 1}}。

因此,在内存中的字符串文字后面的任何字节都会打印出来。字符串文字"SUBI IS IN LOVE WITH PUTHALATH"显然位于该内存部分。

答案 2 :(得分:0)

当我尝试编译时,gcc说:

22:12: warning: ‘stream’ may be used uninitialized in this function
[-Wuninitialized]

这是一个重要的迹象!

char *stream更改为char stream[200];,并按预期工作。但是如果你最后调用write,你就会写出超出字符串的内容以及它后面的内存,因为它没有初始化为0,它可能是随机的垃圾。你可以用这个来纠正:

write(1, stream, strlen(stream)); //correct length, not all 200 bytes

但是,真的,你不应该在父节点写200个字节,因为你是从你没有分配的内存中写的。该数字应该等于字符串的长度(加\0的一个)。