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()函数,进行从管道里面读取数据。
对比一下有名管道和无名管道吧,他们之间有什么不同
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()函数,进行从管道里面读取数据。
相关文章推荐
- Linux系统编程:fifo有名管道的使用
- Linux应用程序开发笔记->文件编程之系统调用方式相关函数
- linux系统编程之管道(三):命令管道(FIFO)
- 【Linux系统编程】进程间通信--有名管道
- Linux下的C语言编程——共享内存及有名管道的使用
- 打开文件linux系统编程之管道(三):命名管道FIFO和mkfifo函数
- linux系统编程之管道(三):命令管道(FIFO)
- linux基础编程 共享内存 使用内存映射接口mmap系统调用
- Linux系统编程:fork函数的使用【循环创建N个子线程】
- Linux下的有名管道(03)---使用函数创建和删除有名管道
- 2011-05-26 18:33 有名管道通信原理及系统调用mkfifo()的使用方法
- linux系统编程之管道(三):命令管道(FIFO)
- linux下使用系统调用编程实现dir命令功能
- linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用
- linux高级编程常用的系统调用函数整理
- linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用
- linux 系统调用sysconf函数使用
- Linux文件编程之--库函数pk系统调用函数
- linux编程---进程间通信---FIFO---有名管道
- Linux C 编程----有名管道FIFO