Linux 为什么复制的文件一直增加dup后缀?

Linux 为什么复制的文件一直增加dup后缀?,第1张

dup函数只有一个参数,也就是输入一个fd,可是没有另外一个参数说,要把这个fd复制给谁?

下面这个小程序,调用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个双字的内存区


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7466923.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-06
下一篇 2023-04-06

发表评论

登录后才能评论

评论列表(0条)

保存