dup and dup2的剖析
重点解释两个地方: 第3幅图,要执行 第5幅图,要执行#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <string.h> int main(void){int fd, save_fd;char msg[] = "This is a test\n";fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);if(fd<0) {perror("open");exit(1);}save_fd = dup(STDOUT_FILENO);dup2(fd, STDOUT_FILENO);close(fd);write(STDOUT_FILENO, msg, strlen(msg));dup2(save_fd, STDOUT_FILENO);write(STDOUT_FILENO, msg, strlen(msg));close(save_fd);return 0;}?
?
dup2(fd, 1);
,文件描述符1原本指向tty
,现在要指向新的文件somefile
,就把原来的关闭了,但是tty
这个文件原本有两个引用计数,还有文件描述符save_fd
也指向它,所以只是将引用计数减1,并不真的关闭文件。dup2(save_fd, 1);
,文件描述符1原本指向somefile
,现在要指向新的文件tty
,就把原来的关闭了,somefile
原本只有一个引用计数,所以这次减到0,是真的关闭了。