创建命名管道有几种方法。前两种可以直接从 shell 完成。
mknod MYFIFO p mkfifo a=rw MYFIFO
以上两个命令执行相同的操作,但有一个例外。`mkfifo` 命令提供了一个钩子,用于在创建 FIFO 文件后立即更改其权限。对于 `mknod` 命令,则需要快速调用 `chmod` 命令。
FIFO 文件可以在物理文件系统中通过长目录列表中的 ``p'' 指示符快速识别。
$ ls -l MYFIFO prw-r--r-- 1 root root 0 Dec 14 22:15 MYFIFO|
另请注意文件名正后方的竖线(``管道符号'')。又一个运行 Linux 的绝佳理由,是吧?
要在 C 语言中创建 FIFO,我们可以使用 `mknod()` 系统调用。
LIBRARY FUNCTION: mknod(); PROTOTYPE: int mknod( char *pathname, mode_t mode, dev_t dev); RETURNS: 0 on success, -1 on error: errno = EFAULT (pathname invalid) EACCES (permission denied) ENAMETOOLONG (pathname too long) ENOENT (invalid pathname) ENOTDIR (invalid pathname) (see man page for mknod for others) NOTES: Creates a filesystem node (file, device file, or FIFO)
mknod("/tmp/MYFIFO", S_IFIFO|0666, 0);
在这种情况下,文件 ``/tmp/MYFIFO'' 被创建为 FIFO 文件。请求的权限是 ``0666'',尽管它们会受到 umask 设置的影响,如下所示:
final_umask = requested_permissions & ~original_umask
一个常用的技巧是使用 `umask()` 系统调用来临时清除 umask 值。
umask(0); mknod("/tmp/MYFIFO", S_IFIFO|0666, 0);
此外,除非我们正在创建设备文件,否则 `mknod()` 的第三个参数将被忽略。在这种情况下,它应该指定设备文件的主设备号和次设备号。