我有一个简单的程序
int main () {
int fd;
int i, rc;
i = 0;
rc = mkfifo ("fff", 0);
fd = open ("fff", O_WRONLY);
fprintf(stdout,"open fifo fff succeeded\n"); fflush (stdout);
while (i<8)
{
rc = write (fd, "abcdefg", 8);
fprintf(stdout,"write to 'fff' returned with rc=%d\n",rc); fflush (stdout);
i++;
}
close (fd);
return 0;
}
我在 Unbuntu 16.04、Linux myserv 4.4.0-81-generic #104-Ubuntu SMP 上运行它,得到以下结果:
open fifo fff succeeded
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
它显示打开和写入都是非阻塞的,没有任何进程打开来读取它。根据 Linux 手册页,
。 。 。但是,它必须在两端同时打开,然后才能对其进行任何输入或输出操作。打开 FIFO 进行读取通常会阻塞,直到其他进程打开同一 FIFO 进行写入,反之亦然。
看来我是有矛盾了。有什么我错过的吗?期待对此的解释。此外,对 FIFO 实施“阻塞写入”有什么建议吗?
答案1
规则#1:阅读手册页了解您所做的一切。
规则#2:如有疑问,请执行ls -la
。
规则#3:调试程序时,打印所有变量。
规则#3a:在没有首先检查某件事是否确实成功之前,不要宣布它已经成功。
第二个参数mkfifo
是模式。您正在创建一个模式(权限)为 0 的 FIFO; IE, p---------
。因此,open
失败并出现 EACCESS 错误,并-1
返回fd
.写入文件描述符-1
失败并出现 EINVAL 错误。