十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
文件描述符0,1,2分别表示标准输入标准输出,标准错误输出, 所以在子进程里close(1)是关闭了标准输出, 然后用dup(fda[1]);此时未用的最小文件描述符就是1(被关闭);这里关闭fda[0]就是为了说明在子进程是管道的写端(fda[0],不关闭是可以的为了保险起见关闭).然后子进程退出会调用系统程序ls,于是当前的文件目录就被发送到管道中.父进程同理, 就是将标准输出作为管道的读端,它读到的是子进程ls后的内容,对文件计数,
成都创新互联公司是一家专业提供华宁企业网站建设,专注与成都网站制作、网站设计、HTML5、小程序制作等业务。10年已为华宁众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。
你可以这样做,但是没有必要。
因为 fd是指向你的打开的文件表项(每个打开的文件都有这么一表项),存在多个fd指向一个表项的情况(如你调用dup2,dup,fcntl),系统采用引用计数的方法,如你有两个fd指向一个文件表现,则计数为2,这样你每次调用close,引用计数减1,减到0是,销毁文件表项以及文件的vnode(inode结构)。即便你不手动关闭文件,进程结束时,系统会自动关闭你打开的文件,所以,试情况而定。有时你可以不必自己close文件。
首先我们要关闭指定的描述符,假如我们希望将文件描述符fd1复制为fd2,那么我们应该先关闭文件描述符fd2。因为这个描述符很有可能被打开了。接下来就是要暴力的调用dup函数复制描述符fd1,直到返回值等于fd2为止。
C语言dup2()函数:复制文件描述词
头文件:
?#include unistd.h
定义函数:?int dup2(int odlfd, int newfd);
函数说明:dup2()用来复制参数oldfd 所指的文件描述词, 并将它拷贝至参数newfd 后一块返回. 若参数newfd为一已打开的文件描述词,
则newfd 所指的文件会先被关闭. dup2()所复制的文件描述词, 与原来的文件描述词共享各种文件状态, 详情可参考dup().
返回值:当复制成功时, 则返回最小及尚未使用的文件描述词. 若有错误则返回-1, errno 会存放错误代码.
附加说明:dup2()相当于调用fcntl(oldfd, F_DUPFD, newfd).
错误代码:EBADF 参数fd 非有效的文件描述词, 或该文件已关闭