我的问题很简单直接。我试图在管道的一端发送数据并尝试从另一端读取。我正在尝试学习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;
}
任何帮助都是因为我被困在这里。
答案 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
的一个)。