系统编程之高级文件IO(十)——文件描述符操作(重定向)
一、换个使用glibc函数与系统调用
C标准库提供了实现两者间相互转换的函数
int fileno(FILE *fp)
把文件指针转换成文件描述符
FILE *fdopen(int fd, const char *mode)
把文件描述符转换成文件指针
int main(int argc, char **argv)
{
int fd = open(argv[1], O_REWR | O_CREAT, 0655);
FILE *fp = fdopen(fd, "a+");
char buffer[1024];
fputs("hello", fp);
fd = fileno(fp);
lseek(fd, 0, SEEK_SET);
int n_r = read(fd, buffer, sizeof(buffer));
fclose(fp);
}
二、文件描述符复制(重定向)
- 2.1 dup
int dup(int oldfd);
当调用dup函数时,内核在进程中创建一个新的文件描述符,此描述符是当前可用文件描述符的最小数值,这个文件描述符指向oldfd所拥有的文件表项。
int new_fd = dup(fd);
write(new_fd, "hello world", 11);
close(new_fd);
调用dup(oldfd)等效于,fcntl(oldfd, F_DUPFD, 0)
- 2.2 dup2
int dup2(int oldfd, int newfd);
dup2和dup的区别就是可以用newfd参数指定新描述符的数值,如果newfd已经打开, 则先将其关闭。
如果newfd等于oldfd,则dup2返回newfd,而不关闭它。
dup2函数返回的新文件描述符同样与参数oldfd共享同一文件表项
调用dup2(oldfd, newfd)等效于,close(newfd); fcntl(oldfd, F_ DUPFD, newfd):
三、应用
网络重定向