next up previous contents
下一主题: 6.3.3 FIFO 操作 上一层: 6.3 命名管道 (FIFO) 前一主题: 6.3.1 基本概念

6.3.2 创建 FIFO

创建命名管道有几种方法。前两种可以直接从 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()` 的更详细讨论,我将留给 man 手册,但让我们考虑一个从 C 语言创建 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()` 的第三个参数将被忽略。在这种情况下,它应该指定设备文件的主设备号和次设备号。



转换于
1996 年 3 月 29 日星期五 14:43:04 EST