0

我的问题很简单直接。在这里我试图在管道的一端发送数据并尝试从另一端读取数据。我正在尝试学习 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 commented in the following program]

 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;
    }

请提供任何帮助,因为我被困在这里。

4

3 回答 3

0

错误

   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

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

于 2013-03-12T19:06:51.053 回答
0

在孩子身上,你

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

将 200 个字节写入管道,从字符串文字开始的位置开始。

当你

write(1,stream,200);

在父级中(在分配内存之后stream),您写入子级写入管道的 200 个字节,而在printf终止字符串文字的 0 字节处停止"SUBI IS IN LOVE WITH PUTHALATH"

因此,内存中该字符串文字后面的任何字节也会被打印出来。字符串文字"IN the parent process and its sleeping \n"显然位于该内存部分中。

于 2013-03-12T19:14:45.453 回答
0

当我尝试编译它时,gcc 说:

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

这是一个重要的迹象!

更改char *streamchar stream[200];并按预期工作。但是,如果你在最后调用它write,你会写出远远超出字符串的内容,并且在它之后发生在内存中的任何内容,并且由于它没有初始化为 0,它可能是随机的垃圾。你可以用这个来纠正:

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

但是,实际上,您不应该在父级中写入 200 个字节,因为您是从尚未分配的内存中写入的。该数字应等于字符串的长度(对于 加一\0)。

于 2013-03-12T19:25:17.417 回答