关于dup和dup2函数

  首先dup和dup2函数是用于复制文件描述符的。他们俩的头文件是#include<unistd.h>

  先说一下dup函数。函数定义 int dup(fd) fd是一个某一个打开的文件的描述符,它的返回值是当前进程可用的最小的文件描述符,同时这个文件描述符和fd同时文件表中的同一个文件。

  对于dup2函数,他也是用于复制文件描述符的但是对于这个函数我们可以指定它的文件描述符值,而不是在进程表的进程表项里查找最小的。函数定义,int dup2(fd1, fd2) 这个函数会先判断fd1和fd2是不是同一个值,如果是的就直接返回fd2。如果不是的,它会先把fd2指向的文件关闭,然后把fd1复制给fd2然后把fd2返回。

  因为dup2这个特性,我们有时候会这么用

dup2(fd, STDOUT_FILENO);

我们不要它的返回值,同时把STOUT_FILENO指向fd所指向的文件。另外再加一点,从shell中运行一个进程,默认会有3个文件描述符存在(0、1、2),0与进程的标准输入相关联,1与进程的标准输出相关联,2与进程的标准错误输出相关联。而我们的printf函数要想输出到屏幕上也需要STOUT_FIENO 而这时候它被指向了一个文件,这样经过这一步以后我们的printf就会直接输出到这个文件里而不会输出到屏幕上。但是有时候我们又需要我们写的程序输出到网页或者屏幕上调错,我们这时候就需要 fork()函数了。fork会复制一个和父进程状态一样的子进程,然后我们可以在子进程中执行dup2而父进程的输入输出不受影响。

          最后这个是进程文件表的关系

 

posted @ 2019-08-19 15:16  我的_笔记  阅读(3842)  评论(1编辑  收藏  举报