C 两个与FIFO通信的程序使用for循环,但不使用while循环

C 两个与FIFO通信的程序使用for循环,但不使用while循环,c,pipe,fifo,C,Pipe,Fifo,我正在尝试编写两个程序,通过C语言中的FIFO进行通信。我正在试验FIFO来完成一项任务 当我知道消息的数量并使用for循环读取它们时,它会打印出从另一端发送的所有消息。如果我使用while循环,它只发送其中两个。代码与此问题略有不同 这项工作: /* writer */ #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> int

我正在尝试编写两个程序,通过C语言中的FIFO进行通信。我正在试验FIFO来完成一项任务

当我知道消息的数量并使用for循环读取它们时,它会打印出从另一端发送的所有消息。如果我使用while循环,它只发送其中两个。代码与此问题略有不同

这项工作:

/* writer */
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    int fd;
    char * myfifo = "/tmp/myfifo";

    /* create the FIFO (named pipe) */


    /* write "Hi" to the FIFO */
    fd = open(myfifo, O_WRONLY);
    int i;
    for(i = 0; i < 10; i++)
         write(fd, "Hi", sizeof("Hi"));
    close(fd);



    return 0;
}
当我将读卡器更改为此时,它不起作用:

#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

#define MAX_BUF 1024

int main()
{
    int fd;
    char * myfifo = "/tmp/myfifo";
    char buf[MAX_BUF];

     mkfifo(myfifo, 0666);
    /* open, read, and display the message from the FIFO */
    fd = open(myfifo, O_RDONLY);
    int i;
    while(read(fd, buf, MAX_BUF))
        printf("Received: %s\n", buf);

    close(fd);

     /* remove the FIFO */
    unlink(myfifo);

    return 0;
}

任何帮助都将不胜感激。

在第二个版本中,循环的继续执行取决于
read()
返回的值,而在第一个版本中,它无条件地循环十次


由于它没有清除缓冲区,只要第一次迭代读取“Hi”,所有后续迭代都将打印“Hi”,而不管第二个版本中的
read()

的成功、部分成功或失败,循环的继续执行取决于
read()
返回的值,而在第一个版本中,它无条件地循环十次


而且,由于它不清除缓冲区,只要第一次迭代读取“Hi”,所有后续迭代都将打印“Hi”,而不管
read()

管道是否成功、部分成功或失败,管道都是基于流的,而不是基于消息的。虽然读取的字节数应与写入的字节数匹配,但
读取
调用的数量不一定与
写入
调用的数量相同

如果我们修改读卡器以打印接收的字节数:

int len;
while((len=read(fd, buf, MAX_BUF)) > 0) {
    printf("Received %d: %s\n", len, buf);
}
我得到以下输出:

收到30:Hi
因此,在第二种情况下,有10个3字节的写入(2个用于字母
H
i
,一个用于空终止字节)和1个30字节的读取。在每次
写入
调用中写入3个字节的原因是字符串常量
“Hi”
的类型为
char[3]


因为第三个字节是终止字符串的空字节,所以只会打印“Hi”的一个实例,所以不会打印超过该字节的内容。

管道是基于流的,而不是基于消息的。虽然读取的字节数应与写入的字节数匹配,但
读取
调用的数量不一定与
写入
调用的数量相同

如果我们修改读卡器以打印接收的字节数:

int len;
while((len=read(fd, buf, MAX_BUF)) > 0) {
    printf("Received %d: %s\n", len, buf);
}
我得到以下输出:

收到30:Hi
因此,在第二种情况下,有10个3字节的写入(2个用于字母
H
i
,一个用于空终止字节)和1个30字节的读取。在每次
写入
调用中写入3个字节的原因是字符串常量
“Hi”
的类型为
char[3]


因为第三个字节是终止字符串的空字节,所以只打印了一个“Hi”实例。如果不检查
read()的结果,您怎么知道第一个版本工作?如果它没有读取任何内容
buf
将保留以前的内容contents@IngoLeonhardt你是对的。刚刚编辑了答案,它一直打印出0作为返回值。你对我应该怎么做有什么建议吗?如果你不检查
read()
,你怎么知道第一个版本是有效的?如果它没有读取任何内容
buf
将保留以前的内容contents@IngoLeonhardt你是对的。刚刚编辑了答案,它一直打印出0作为返回值。你对我应该怎么做有什么建议吗?正如编辑中的输出所示,这十次写入的所有数据都在前两次读取中读取。正如编辑中的输出所示,这十次写入的所有数据都在前两次读取中读取。我明白了,我在试验时也注意到,但我仍然不知道让他们经常交流的最好方式是什么。我接受这个答案。因为它让我意识到我不应该在管道中写空值,因为它会弄乱另一端。我把代码改为“sizeof(“Hi”)-1”,现在它会打印出一堆Hi。谢谢。我明白了,我在试验时也注意到了这一点,但我仍然不知道让他们不断交流的最佳方式是什么。我接受这个答案。因为它让我意识到我不应该在管道中写空值,因为它会弄乱另一端。我把代码改为“sizeof(“Hi”)-1”,现在它会打印出一堆Hi。
Received: Hi
Received: Hi
int len;
while((len=read(fd, buf, MAX_BUF)) > 0) {
    printf("Received %d: %s\n", len, buf);
}