C 在管道中传输的数据是垃圾

C 在管道中传输的数据是垃圾,c,pipe,exec,fork,named-pipes,C,Pipe,Exec,Fork,Named Pipes,我正在使用这两个程序的答案。这个答案使用命名管道而不是管道,对吗 我已经编写了main.c,它实际上是我实际项目的代码,最小化到这个特定的问题(这就是为什么我有一个for循环的例子) 你的循环(或缺少)与此无关。当读卡器在编写器创建管道之前打开(open())管道进行读取时,读卡器等待的文件描述符无效(-1)。所以,即使writer稍后写东西,reader也只是等待一个无效的fd(-1),永远不会读取任何东西。简单地说,您可以通过以下方法解决此问题: while( (fd = open(myfi

我正在使用这两个程序的答案。这个答案使用命名管道而不是管道,对吗

我已经编写了main.c,它实际上是我实际项目的代码,最小化到这个特定的问题(这就是为什么我有一个for循环的例子)

你的循环(或缺少)与此无关。当读卡器在编写器创建管道之前打开(
open()
)管道进行读取时,读卡器等待的文件描述符无效(
-1
)。所以,即使writer稍后写东西,reader也只是等待一个无效的fd(
-1
),永远不会读取任何东西。简单地说,您可以通过以下方法解决此问题:

while( (fd = open(myfifo, O_RDONLY)) == -1); 

在读卡器中,使其等待管道可用。事实上,我想知道是否有比这更好的方法。我能想到的另一种方法是在
access()
上循环,但它与此没有太大区别…

您应该在
read()
周围使用read循环,以确保读取所有字节。同样,您应该在
write()
周围使用写循环,以确保所有字节都被写入。然而,我不认为你没有做这些事情是你观察到的行为的原因。在
strace-f
下运行您的程序可能会更深入地了解正在发生的事情。另外,请注意,如果您不需要或不想管理低级
read()
write()
调用,您可以
fopen()
FIFO并使用流I/O。您到底应该知道要读取多少个字符?无论是否有读循环,您如何知道您已经读取了一条消息的所有数据?答案是您需要在读写器之间定义某种协议。不一定要复杂。例如,可能每条消息都以换行符结尾。如果您的消息基本上是基于文本的,如您的示例所示,那么您可能会发现流I/O比低级的
read()
write()
系统调用更易于使用。让我们看看是否有人有不同的想法。有趣的是:)我还有一个关于这行的问题
char*myfifo=“/tmp/myfifo”。假设我有两个作者和两个读者,我希望其中一个读者能够阅读两个作者的作品,同样,另一个读者的行为。我应该换这行吗?我的意思是,这意味着这个
tmp/myfifo
被视为一个共享地址空间?我还没有接受你的回答,只是想看看是否有人带着更有效的东西进来命名管道在概念上类似于一个普通文件,其中一个进程执行写操作,另一个进程执行读操作。与普通文件不同,写入管道的数据只能读取一次。所以多个阅读器不能“共享”一个管道。多个写入程序可以写入同一管道,但数据可能交错或损坏。管道不是为多个进程的读/写而设计的。您最好使用其他管道。我被指示使用命名管道。所以我应该创建更多的管道。有多少是我仍然要想到的。
Received: Hi
All children are done
samaras@samaras-A15:~/test$ ./m
Received: Hi
All children are done
samaras@samaras-A15:~/test$ ./m
Received:        <----------------- This is garbage, that is not reproducible 
^C
...
[pid  3326] read(-1, 0xbfddd80c, 1024)  = -1 EBADF (Bad file descriptor)^C
Process 3324 resumed
Process 3325 detached
Process 3326 detached
while( (fd = open(myfifo, O_RDONLY)) == -1);