在父母和孩子中首先打开fifo的奇怪行为

时间:2016-11-16 23:07:00

标签: c linux fork mkfifo

所以我最近一直在用C语言中的fifo和fors玩,我有点困惑。我在2个不同的设备上运行以下代码,每次都会得到不同的结果。

代码是:

#define MAX_BUF 1024
int main(int argc, char const *argv[]) {
  int fd,rc,bytes_in,pid,status;
  char buf[256];
  struct pollfd fdarray [1];

  mkfifo("out.fifo", 0700);

  if (fork() == 0) {

    fd = open("out.fifo", O_WRONLY, 0);
    printf("fifo opened on child\n" );
    exit(1);
  }

    printf("parent is gonna sleep\n" );
    sleep(10);
    printf("parent woke up\n" );
    fd = open("out.fifo", O_RDONLY, 0);
    printf("fifo opened on father\n" );
    return 0;
}

我在2个不同的设备中运行此代码。两个设备都运行debian 8.每个设备的结果如下。

第一个:

parent is gonna sleep
fifo opened on child
parent woke up
fifo opened on father

第二个

parent is gonna sleep
parent woke up
fifo opened on father
fifo opened on child

所以这看起来很奇怪。通常在两个设备中它应该等待父级唤醒或者可能发生错误,因为正如fifo的手册页中所述

opening for write-only will fail with ENXIO (no such 
device or address) unless the other end has already been opened.

而是在我的设备中,它首先打开子进程运行子进程。在另一台设备上它只是等待。有人能解释我为什么会这样吗?我做错了吗?

ΕDIT:嗯,听起来可能很奇怪,但今天它运作正常。当我运行完全相同的代码时,父母睡觉,孩子等到父母醒来打开fifo

0 个答案:

没有答案