函数功能
#include <unistd.h>
int dup(int fd) ;
int dup2(int fd, int fd2) ;
// 调用dup(oldfd)等效于
fcntl(oldfd, F_DUPFD, 0)
// dup2(fd, fd2) ;
close(fd2);
fcntl(fd, F_DUPFD, fd2);
- dup和dup2都可以用来复制一个现有的文件描述符,返回的新的文件描述符与fd共享一个文件表项。
- 两者不同之处是,dup2可以用参数fd2指定新的描述符。
- 若fd2已经打开,则先将其关闭。若fd等于fd2,则不关闭它。fcntl函数的功能之一就是复制一个现有的描述符。
简单示例代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#define TXT "a.txt"
int main(int argc, char * argv[])
{
int fd1, fd2;
fd1 = open(TXT, O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd1 == -1)
{
perror("Error open func.\n");
exit(EXIT_FAILURE);
}
fd2 = dup(fd1);
if (fd2 == -1)
{
perror("Error dup func.\n");
exit(EXIT_FAILURE);
}
int n;
char buf[1000];
while ((n = read(STDIN_FILENO, buf, 1000)) > 0)
{
if (write(fd2, buf, n) < n)
{
perror("Error write func.\n");
exit(EXIT_FAILURE);
}
}
exit(EXIT_SUCCESS);
}
题目:要求不使用fcntl来实现dup2的功能。