您的位置:首页 > 运维架构 > Linux

linux下c编程系统调用之有名管道FIFO函数的使用及案例

2012-04-25 23:16 911 查看
刚刚谢了一个关于无名管道的博客,说的不是特别的详细,唉。。。

对比一下有名管道和无名管道吧,他们之间有什么不同

1.有名管道活在父子进程中,也就是说有名管道用在两个有关系的进程中可以进行数据的流入流出

2.无名管道可以用于在两个毫不相干的进程直接通信,从而实现了进程间的同学

mkfifo函数使用

mkfifo(建立实名管道)

  相关函数

  pipe,popen,open,umask

  表头文件

  #include<sys/types.h>

  #include<sys/stat.h>

  定义函数

  int mkfifo(const char * pathname,mode_t mode);

  函数说明

 mkfifo ()会依参数pathname建立特殊的FIFO文件,该文件必须不存在,而参数mode为该文件的权限(mode%~umask),因此 umask值也会影响到FIFO文件的权限。mkfifo()建立的FIFO文件其他进程都可以用读写一般文件的方式存取。当使用open()来打开 FIFO文件时,O_NONBLOCK旗标会有影响

  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<unistd.h>

  #include<fcntl.h>

  int main(void)

  {

  int fd;

char buffer[50]={NULL};

fd=open("fifo",O_RDONLY);

read(fd,buffer,20);

printf("%s",buffer);

  return 0;

  }

  执行

  hello!

  示例2:

  #include<sys/types.h>

  #include<sys/stat.h>

  #include<unistd.h>

  #include<fcntl.h>

  #include<stdio.h>

  int main( int argc, char **argv )

  {

  mode_t mode = 0666;

char string[]="xiexienideai";

int fd;

if ( argc !=2 )

  {

  printf( "Usage:[%s] fifo_filename\n", argv[0] );

  return -1;

  }

unlink("fifo");

  if (mkfifo(“file”, mode)<0 )

  {

  perror( "mkfifo");

  return -1;

  }

fd=open("fifo",O_WRONLY);

write(fd,string,strlen(string)+1);

  return 0;

  }

在此,偶要说明一下这两个进程了:


1.进程2通过调用mkfifo()函数创建了一个实名管道,打开管道文件,并且向这个管道里面写入了一个字符串string

2.进程1打开管道文件,然后调用read()函数,进行从管道里面读取数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: