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

时间:2018-04-15 10:11:56

标签: c file ipc named-pipes fifo

我正在尝试在两个进程之间实现基本通信。我打算让每个进程接收一条信息,然后传回一个。我是管道新手,所以尝试使用此代码示例: 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,所以我尝试在某些事件后使用睡眠,但我无法让它工作。

1 个答案:

答案 0 :(得分:0)

第二个程序收到5,但是没有成功发回10个?那个FIFO的属性,两个进程都应该还活着对方。当first流程发送5并完成后,当second流程发送10时,谁会收到?没人,因为first进程已经结束了。

因此,解决方案可以正确使用sleep(),也可以在以下两个流程中使用fork() p1过程p2过程

if(fork() == 0) {                          if(fork() == 0) { 
   send 5 using fifo_one                      send 10 using fifo_two   

}                                          }
else {                                     else {
   recieve 10 using fifo_two                   recieve 5 using fifo_one
}                                          }