织梦网站后台模板/seo优化百度技术排名教程
fcntl函数与dup/dup2函数
1.fcntl
函数
控制int fcntl(int fd, int cmd, long arg)
如果管道是空的,read()默认是阻塞,可以通过
fcntl
函数改变管道状态,设置为非阻塞防止数据丢失。
- 参数
把文件描述符改为非阻塞的
fcntl(filedes,F_SETFL,O_NONBLOCK);
2.dup
/dup2
函数
dup/dup2
标准输入输出重定向函数
- 文件描述符复制
内核为每个进程创建的文件描述符。
① 函数int dup(int oldfd)
- 参数
- 返回值
dup
用来复制参数oldfd
所指的文件描述符。当复制成功是,返回最小的尚未被使用过的文件描述符,若有错误则返回-1
.错误代码存入errno
中返回的新文件描述符和参数oldfd
指向同一个文件,这两个描述符共享同一个数据结构,共享所有的锁定,读写指针和各项全现或标志位。
② 函数int dup2(int oldfd, int newfd)
- 参数
- 返回值
dup2
与dup
区别是dup2
可以用参数newfd
指定新文件描述符的数值。若参数newfd
已经被程序使用,则系统就会将newfd
所指的文件关闭,若newfd
等于oldfd
,则返回newfd
,而不关闭newfd
所指的文件。dup2
所复制的文件描述符与原来的文件描述符共享各种文件状态。共享所有的锁定,读写位置和各项权限或flags
等.
示例
- 复制标准输出
新文件描述符与旧文件描述符不同,但是具备旧文件描述符功能
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>int main(){int fd = dup(STDOUT_FILENO);fprintf(fdopen(fd,"w"),"%d printf:Hello dup\n",fd);
}
- 复制文件描述符
新文件描述符与旧文件描述符不同,但是具备旧文件描述符功能
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define FILE_MODE (S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH)int main(){int fd = open("./test",O_CREAT|O_RDWR,FILE_MODE); char str[]="Hello dup\n";write(fd,str,sizeof(str));int cp_fd = dup(fd);printf("copy %d to %d",fd,cp_fd);write(cp_fd,str,sizeof(str));//fprintf(fdopen(fd,"w"),"%d printf:Hello dup\n",fd);close(fd);
}
- 把文件描述符重定向(复制)到标准输出
printf()
直接输出到文件中,不再输出到终端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>#define FILE_MODE (S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH)int main(){int fd = open("./test",O_CREAT|O_RDWR,FILE_MODE); char str[]="Hello dup\n";dup2(fd,STDOUT_FILENO);printf("%d printf:Hello dup\n",fd);
}
特点
必须是亲缘进程之间
dup()/dup2()原理图