C语言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 中.
错误代码:
1、EACCESS 参数pathname 所指定的目录路径无可执行的权限
2、EEXIST 参数pathname 所指定的文件已存在.
3、ENAMETOOLONG 参数pathname 的路径名称太长.
4、ENOENT 参数pathname 包含的目录不存在
5、ENOSPC 文件系统的剩余空间不足
6、ENOTDIR 参数pathname 路径中的目录存在但却非真正的目录.
7、EROFS 参数pathname 指定的文件存在于只读文件系统内.
范例
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
main()
{
char buffer[80];
int fd;
unlink(FIFO);
mkfifo(FIFO, 0666);
if(fork() > 0)
{
char s[] = "hello!\n";
fd = open(FIFO, O_WRONLY);
write(fd, s, sizeof(s));
close(fd);
}
else
{
fd = open(FIFO, O_RDONLY);
read(fd, buffer, 80);
printf("%s", buffer);
close(fd);
}
}
执行:
hello!
头文件:#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 中.
错误代码:
1、EACCESS 参数pathname 所指定的目录路径无可执行的权限
2、EEXIST 参数pathname 所指定的文件已存在.
3、ENAMETOOLONG 参数pathname 的路径名称太长.
4、ENOENT 参数pathname 包含的目录不存在
5、ENOSPC 文件系统的剩余空间不足
6、ENOTDIR 参数pathname 路径中的目录存在但却非真正的目录.
7、EROFS 参数pathname 指定的文件存在于只读文件系统内.
范例
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
main()
{
char buffer[80];
int fd;
unlink(FIFO);
mkfifo(FIFO, 0666);
if(fork() > 0)
{
char s[] = "hello!\n";
fd = open(FIFO, O_WRONLY);
write(fd, s, sizeof(s));
close(fd);
}
else
{
fd = open(FIFO, O_RDONLY);
read(fd, buffer, 80);
printf("%s", buffer);
close(fd);
}
}
执行:
hello!