FIFO管道返回0而不是正确的整数?

Posted

技术标签:

【中文标题】FIFO管道返回0而不是正确的整数?【英文标题】:FIFO pipe returns 0 instead of correct integer? 【发布时间】:2018-04-15 10:11:56 【问题描述】:

我正在尝试实现两个进程之间的基本通信。我打算让每个进程接收一条信息,然后再传回一条信息。我是管道新手,因此尝试使用此代码示例进行此操作: How to send a simple string between two programs using pipes?

我设置了代码,它工作正常,然后我复制了第二个管道的代码,以便接收另一个整数。但是我的第二个管道不传输整数,程序收到一个 0 代替。

program1.c:

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

#define MAX_BUF 1024
int main()

    int fd; // file descriptor
    int fd_b;
    int data = 5;
    int buf; // buffer from fifo
    char * fifo_one = "/tmp/fifo_one";
    char * fifo_two = "/tmp/fifo_two";

    // create fifo
    mkfifo(fifo_one, 0666);

    // write to FIFO
    fd = open(fifo_one, O_WRONLY);
    write(fd, &data, sizeof(&data));
    close(fd);

    // remove FIFO
    unlink(fifo_one);

    // receive from FIFO
    fd_b = open(fifo_two, O_RDONLY);
    read(fd_b, &buf, MAX_BUF);
    printf("Received: %d\n", buf);
    close(fd_b);

    return 0;

program2.c:

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

#define MAX_BUF 1024

int main()

    int fd; // file descriptor
    int fd_b;
    char * fifo_one = "/tmp/fifo_one";
    char * fifo_two = "/tmp/fifo_two";
    int buf; // buffer from fifo
    int ret_dat; // return data

    // receive data from fifo
    fd = open(fifo_one, O_RDONLY);
    read(fd, &buf, MAX_BUF);
    printf("Received: %d\n", buf);
    close(fd);

    // decide return
    if (buf == 5) 
        ret_dat = 10;
    

    // send data back

    // create fifo
    mkfifo(fifo_two, 0666);

    // write to FIFO
    fd_b = open(fifo_two, O_WRONLY);
    write(fd_b, &ret_dat, sizeof(&ret_dat));
    close(fd_b);

    // remove FIFO
    unlink(fifo_sendBal);

    return 0;

第二个程序接收到5,但是没有成功发回10,

我知道时间会影响 IPC,所以我尝试在某些事件后使用睡眠,但我无法让它工作。

【问题讨论】:

您应该添加一些错误检查 (perror(3))。 无关:write(fd, &amp;data, sizeof(&amp;data)); 非常错误,您不需要与号。只需write(fd, &amp;data, sizeof data); 即可。[您还应该检查从 read() 和 write() 获得的返回值] 3)read(fd_b, &amp;buf, MAX_BUF); 是灾难的根源。 read()write() 读取或写入最多请求的字节数。他们可以并且经常确实返回小于请求值的数字。可以安全忽略返回值的用途并不多,尤其是在您必须处理错误时。 【参考方案1】:

第二个程序接收到 5,但没有成功返回 10? 调用mkfifo() 创建的FIFO 进程间通信的属性是两个进程都应该活着互相交流。来自mkfifo的手册页

一旦您以这种方式创建了FIFO 特殊文件,任何进程 可以打开它进行阅读或写作,就像普通的一样 文件。但是,它必须在两端同时打开之前 您可以继续对其进行任何输入或输出操作。开幕式 用于读取的 FIFO 通常会阻塞,直到其他进程打开 写入时使用相同的 FIFO,反之亦然。请参阅fifo(7) 了解非阻塞 处理先进先出的特殊文件。

【讨论】:

以上是关于FIFO管道返回0而不是正确的整数?的主要内容,如果未能解决你的问题,请参考以下文章

Linux-进程间通信: FIFO

第4章 管道和FIFO

进程间通信之管道--pipe和fifo使用

Redshift 返回一个 []uint8 而不是整数,在它们之间转换会返回不正确的值

3.2 进程间通信之fifo

toupper 返回整数而不是字符