下面这个小程序,调用fd的结果是,打开的一个文件fd被复制到了标准输出,以至于execl调用的打印内容,被重定向到了文件当中。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
int main(void){
int filedes
if((filedes=open("dd.txt",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))<0)
fprintf(stderr,"%s ","open file error")
close(1)
dup(filedes)
close(filedes)
execlp("ls","-l",(char * )0)
return 0
}
所以看起来dup程序就是要复制一个fd到stdout。是这样的吗,如果我要dup到stdout以外的fd怎么办呢?
------解决思路----------------------
dup返回的是当前最小可用描述符,你这里会重定向到标准输出是因为你close(1),使标准输出描述符可以被用,所以dup返回了1.
如果我要dup到stdout以外的fd,使用dup2
文件描述符0,1,2分别表示标准输入标准输出,标准错误输出, 所以在子进程里close(1)是关闭了标准输出, 然后用dup(fda[1])此时未用的最小文件描述符就是1(被关闭)这里关闭fda[0]就是为了说明在子进程是管道的写端(fda[0],不关闭是可以的为了保险起见关闭).然后子进程退出会调用系统程序ls,于是当前的文件目录就被发送到管道中.父进程同理, 就是将标准输出作为管道的读端,它读到的是子进程ls后的内容,对文件计数,DUP表示数据重复定义,也就是复制 *** 作数。?表示所定义的变量未指定初值,就是说定义的单元不存新数据。(而是为以后使用做准备,即保留这些单元)
扩展资料:
1、DUP函数功能:数据定义伪指令,它可以按照给定的次数来复制某个(某些) *** 作数,可以避免多次键入同样一个数据。也就是定义重复的字节、字、双字、结构等内存缓冲区。
2、DUP函数返回值:
成功:dup函数返回当前系统可用的最小整数值。
失败:均返回-1,并设置errno。
注意:通过dup和dup2创建的文件描述符并不继承原文件描述符的属性。比如close-on-exec和non-blocking。
3、举例:
buf1 db 100 dup(?)---------开辟100个字节的内存区
buf2 dw 200 dup(?)--------开辟200个字的内存区
buf3 dd 300 dup(?)--------开辟300个双字的内存区
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)