gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:04:49 25 4
gpt4 key购买 nike

我正在尝试编写两个将通过 C 中的 FIFO 进行通信的程序。我正在为我的任务试验 FIFO。

当我知道消息的数量并使用 for 循环读取它们时,它会打印出从另一端发送的所有消息。如果我使用 while 循环,它只会发送其中的两个。代码与这个问题略有不同 How to send a simple string between two programs using pipes?

这个有效:

/* 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;
for(i = 0; i < 10; i++)
{
int n = read(fd, buf, MAX_BUF);
printf("n = %d , Received: %s\n",n, buf);
}
close(fd);

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

return 0;
}

编辑:现在打印

n = 18 , Received: Hi
n = 12 , Received: Hi
n = 0 , Received: Hi
n = 0 , Received: Hi
n = 0 , Received: Hi
n = 0 , Received: Hi
n = 0 , Received: Hi
n = 0 , Received: Hi
n = 0 , Received: Hi
n = 0 , Received: Hi

当我将阅读器更改为此时,它不起作用:

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

我在两个独立的终端和所有终端中运行这两个程序。当我用第二个阅读器运行它们时,它只打印出:

Received: Hi
Received: Hi

如有任何帮助,我们将不胜感激。

最佳答案

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

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

int len;
while((len=read(fd, buf, MAX_BUF)) > 0) {
printf("Received %d: %s\n", len, buf);
}

我得到以下输出:

Received 30: Hi

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

您只会看到一个“Hi”的实例被打印出来,因为第三个字节是一个终止字符串的空字节,所以超过它的任何内容都不会被打印出来。

关于c - 与 FIFO 通信的两个程序使用 for 循环但不使用 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43610296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com