linux编程--有名管道

1.有名管道FIFO

  管道如果无名,只能在共同血缘进程中使用;管道如果有名,就可以在整个系统中使用。FIFO管道,有名的管道,它以一种特殊的文件类型存储于文件系统中,以供血缘关系进程访问。

1.有名管道的建立:

  shelle命令和C程序都可以创建有名管道,其中创建有名管道的shell命令如下:

1)命令mknod创建管道

可以创建特殊类型的文件,其实用方式如下

 

/etc/mknod name [b|c ] major minor/*创建块设备或字符设备文件*/

/etc/mknod name p /*创建管道文件*/

/etc/mknod name s  /*创建信号量*/

/etc/mknod name m  /*创建共享内存*/

 

参数name为创建管道的文件名称,参数major和minor分别代表主、次设备


ex1:创建有名管道k1

 

$ mknod k1 p

 $ls -l k1

prw-r--r-- 1 root sys  0 [date]

2)命令mkfifo创建管道

专门创建有名管道文件,它的语法如下:

mkfifo [-m Mode] File ...

其中参数Mode是管道文件创建后的访问权限,File是管道文件创建后的名称

 

ex1:创建一个用户本身可读写,其它任何用户都只读的管道文件k2

 

mkfifo -m 644 k2

int mkfifo(char *path,mode_t mode);

其中path-->管道文件的路径和名称

      mode-->管道文件的权限,类似open函数的第三个参数,并且自带了O_CREAT 和O_EXCL选项,因此本函数只能创建一个不存在的管道文件,或者返回"文件已存在"错误。如果只是希望打开而不创建文件,请使用open或fopen。

成功调用mkfifo返回0,错误饭后-1。

mode:属性(与文件操作相同)
一旦创建了一个FIFO,就可以用open打开它,一般的文件访问函数(close,read,write)都可以用于FIFO

当打开FIFO时,非阻塞标志(O_NONBLOCK)

将对以后的读写产生如下影响:

1 没有使用 O_NONBLOCK:访问要求无法满足时进程阻塞。如读取空的FIFO时,或者FIFO已满时。

2 使用O_NONBLOCK:访问要求无法满足时不阻塞,立即出错返回,error是ENXIO。

低级文件编程库和标准文件编程库都可以操作管道,在打开管道文件务必请先确认该管道是否存在和是否具备访问权限。

管道在执行读写操作前,两端必须同时打开,否则执行打开管道某端操作的进程将一直阻塞知道某个进程以相反方向打开管道位置。


1、当使用O_NONBLOCK 旗标时,打开FIFO 文件来读取的操作会立刻返回,但是若还没有其他进程打开FIFO 文件来读取,则写入的操作会返回ENXIO 错误代码。
2、没有使用O_NONBLOCK 旗标时,打开FIFO 来读取的操作会等到其他进程打开FIFO文件来写入才正常返回。同样地,打开FIFO文件来写入的操作会等到其他进程打开FIFO 文件来读取后才正常返回。
返回值
若成功则返回0,否则返回-1,错误原因存于errno中。
错误代码
EACCESS 参数pathname所指定的目录路径无可执行的权限
EEXIST 参数pathname所指定的文件已存在。
ENAMETOOLONG 参数pathname的路径名称太长。
ENOENT 参数pathname包含的目录不存在
ENOSPC 文件系统的剩余空间不足
ENOTDIR 参数pathname路径中的目录存在但却非真正的目录。
EROFS 参数pathname指定的文件存在于只读文件系统内。

1.表头文件 #include<sys/types.h>
                  #include<sys/stat.h>
                  #include<fcntl.h> 


2.定义函数 int open( const char * pathname, int flags);
                   int open( const char * pathname,int flags, mode_t mode);

       对于 open 函数来说,第三个参数(...)仅当创建新文件时才使用,用于指定文件的访问权限。pathname 是待打开/创建文件的路径名;oflag 用于指定文件的打开/创建模式,这个参数可由以下常量(定义于 fcntl.h)通过逻辑或构成。

      O_RDONLY       只读模式
      O_WRONLY      只写模式
      O_RDWR          读写模式

以上三者是互斥的,即不可以同时使用。打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的:

      O_APPEND       每次写操作都写入文件的末尾
      O_CREAT        如果指定文件不存在,则创建这个文件
      O_EXCL         如果要创建的文件已存在,则返回 -1,并且修改 errno 的值
      O_TRUNC        如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
      O_NOCTTY       如果路径名指向终端设备,不要把这个设备用作控制终端。
      O_NONBLOCK     如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)。

以下三个常量同样是选用的,它们用于同步输入输出

     O_DSYNC        等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
     O_RSYNC        read 等待所有写入同一区域的写操作完成后再进行
     O_SYNC         等待物理 I/O 结束后再 write,包括更新文件属性的 I/O

 

3.返回值:成功则返回文件描述符,否则返回 -1。 

      返回文件描述符(整型变量0~255)。由open 返回的文件描述符一定是该进程尚未使用的最小描述符。只要有一个权限被禁止则返回-1。

 

4.错误代码:(均已E开头,将其去掉就是有关于错误的方面的单词或单词的缩写)

       EEXIST 参数pathname 所指的文件已存在,却使用了O_CREAT和O_EXCL旗标。
       EACCESS 参数pathname所指的文件不符合所要求测试的权限。
       EROFS 欲测试写入权限的文件存在于只读文件系统内。
       EFAULT 参数pathname指针超出可存取内存空间。
       EINVAL 参数mode 不正确。
       ENAMETOOLONG 参数pathname太长。
       ENOTDIR 参数pathname不是目录。
       ENOMEM 核心内存不足。
       ELOOP 参数pathname有过多符号连接问题。
       EIO I/O 存取错误。

O_EXCL O_CREAT 同时也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。

有名管道是一种进程间通信机制,只是在硬盘上有一个文件名字而已,显示的大小应该是0

S_IFIFO表示要创建一个FIFO文件


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值