博客搬家,原地址:https://langzi989.github.io/2017/05/21/函数dup/
函数原型
#include <unistd.h>
int dup(int fd);
int dup2(int fd, int fd2);
函数功能
这两个函数的功能都是用来复制一个现有的文件描述符。返回的文件描述符与原有的文件描述符共用同一个文件表项,但是文件描述符标志将被清除,即当进程调用exec时文件描述符将不会被关闭。
返回值
dup返回当前可用的最小的文件描述符。dup2返回fd2,若fd2所表示的文件已经打开,则将该文件描述符先关闭,然后再将fd复制到fd2上返回。若fd2与fd相同,则直接返回fd、.
等效函数
dup函数与fcntl的F_DUPFD功能相同。
dup(fd)等效于fcntl(fd, F_DUPFD, 0)
dup2(fd, fd2)等效于close(fd), fcntl(fd, F_DUPFD, fd2)
但是dup2是原子的上述先关闭然后在复制不是原子操作。
作用及用途
dup函数常用来重定向进程的stdin、stdout以及stderr。原理与CGI类似,即将标准输入标准输出重定向到一个文件或者socket流等。
重定向标准输出
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
int main() {
int fd = dup(STDIN_FILENO);
if (fd < 0) {
printf("dup error\n");
exit(1);
}
char buf[] = "this is a test of dup\n";
write(fd, buf, sizeof(buf));
return 0;
}