【发布时间】:2016-06-18 02:48:48
【问题描述】:
为什么 F_GETPIPE_SZ 会返回 -1?这听起来像是一个错误,但我找不到任何关于它是什么错误的提及,或者更重要的是,我应该做什么才能不得到错误。
我在 Raspberry Pi 上运行 Raspbian,物有所值。我还没有在我的桌面 Debian 上尝试过代码。据我所知,我正在遵循教科书 F_GETPIPE_SZ 示例。我错过了什么吗?
#define _GNU_SOURCE
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fd, pipesize;
fd = mkfifo("/tmp/audio-fifo",0666);
// fcntl(fd, F_SETPIPE_SZ, 4096);
pipesize = fcntl(fd, F_GETPIPE_SZ);
printf("Pipe size: %d\n", pipesize);
return 0;
}
【问题讨论】:
-
mkfifo成功返回 0,失败返回 -1。而fnctl期望第一个参数是文件描述符。 -
换句话说,
mkfifo ...; fd = open("/tmp/audio-fifo", ...) -
尝试在
fcntl()之后直接检查errno(使用#include <errno.h>)。但是错误值大概是EINVAL。假设mkfifo()成功,您尝试获取文件描述符0的管道大小。mkfifo()为 fifo 创建文件系统条目,它不会打开 fifo 的文件描述符。 -
谢谢大家,我现在明白为什么错了。所以我只是在 mkfifo 中使用相同的路径字符串并打开?