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
等.
示例
- 复制标准输出
新文件描述符与旧文件描述符不同