微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

读取管道时从 buf 打印的问题

如何解决读取管道时从 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将其写入终端。

enter image description here

这就是正在发生的事情,printf 应该打印 pid 和来自 de buf 的消息,但这并没有发生,我不知道为什么。

添加了客户的代码。我使用两个缓冲区,一个用于发送 pid,另一个用于发送消息,因为我只使用一个缓冲区时遇到了问题

解决方法

这是一种实现方式,使用简单的旧 C 语言,在 Debian Buster 和 Eclipse CDT 中测试。您需要将文件名中的 /home/myhomedir/myfifo 替换为文件系统上相应路径。先前使用 mkfifo /home/myhomedir/myfifo

创建的 FIFO 文件
#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 举报,一经查实,本站将立刻删除。