如何解决读取管道时从 buf 打印的问题
我正在尝试使用 mkfifo 在 C 中创建服务器和客户端之间的通信。
在下图中,您有我编写的代码,用于从名为 fifo 的管道中读取并在终端上写入。我使用系统调用 write 从 buf 中写入控制台,一切都很好,但是 printf 应该打印与 write 调用相同的内容。
int fifo_fd = open("fifo",O_WRONLY);
int pid = getpid();
char buff_pid[sizeof(pid) + 3];
sprintf(buff_pid,"%d:",pid);
char buf[1024];
int bytes_read;
while ((bytes_read = read(0,buf,1024)) > 0 ){
write(fifo_fd,buff_pid,sizeof(buff_pid));
write(fifo_fd,bytes_read);
}
然而,这就是正在发生的事情。左边是服务器,右边是客户端。客户端向服务器发送消息,然后服务器读取它并使用客户端的pid将其写入终端。
这就是正在发生的事情,printf 应该打印 pid 和来自 de buf 的消息,但这并没有发生,我不知道为什么。
我添加了客户的代码。我使用两个缓冲区,一个用于发送 pid,另一个用于发送消息,因为我只使用一个缓冲区时遇到了问题
解决方法
这是一种实现方式,使用简单的旧 C 语言,在 Debian Buster 和 Eclipse CDT 中测试。您需要将文件名中的 /home/myhomedir/myfifo
替换为文件系统上相应路径。先前使用 mkfifo /home/myhomedir/myfifo
#include <iostream>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
using namespace std;
int main() {
int fdRd = open("/home/myhomedir/myfifo",O_RDONLY | O_NONBLOCK);
if (fdRd < 0) {
return -1;
}
int fdWr = open("/home/myhomedir/myfifo",O_WRONLY);
if (fdWr < 0) {
close(fdRd);
return -1;
}
char buf[64];
for (int cnt = 0; cnt < 5; cnt++) {
sprintf(buf,"demo %i\n",cnt);
write(fdWr,buf,strlen(buf));
int len = read(fdRd,sizeof(buf)-1);
if (len > 0) {
buf[len] = '\0';
fwrite(buf,sizeof(buf[0]),strlen(buf),stdout);
}
}
close(fdRd);
close(fdWr);
return 0;
}
它会打印出来:
演示 0
演示 1
演示 2
演示 3
演示 4
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。