当我首先将dup2
直接stdout
用于临时文件,然后使用公共文件时,我遇到了问题。这是我的代码的一部分:
FILE* fdArch=fopen("file.txt","w");
char nameBuff[100];
memset(nameBuff,0,sizeof(nameBuff));
strncpy(nameBuff,"/tmp/myTmpFile-XXXXXX",sizeof("/tmp/myTmpFile-XXXXXX"));
int fdNewFile=mkstemp(nameBuff);
if(fdNewFile==-1){
perror("error creating temporal file");
}
dup2(fdNewFile,STDOUT_FILENO);
read(fd[0], readbuffer, sizeof(readbuffer));
char *argv[]={ "/home/user/workspace/CProgram/Debug/program", readbuffer, NULL};
execv(argv[0],argv);
close(fdNewFile);
dup2(fileno(fdArch),STDOUT_FILENO);
char *argv1[]={"/usr/bin/sort",nameBuff, NULL};
execv(argv1[0],argv1);
fclose(fdArch);
unlink(nameBuff);
我运行一个名为program的外部程序,out用dup2
重定向到一个临时文件,这很好用,但是当我用dup2
stdout
重定向到{ {1}}并对临时文件运行排序,out不会重定向到fdArch
。
是否存在概念错误或缺少某些内容?
答案 0 :(得分:2)
我运行一个名为program的外部程序,out用dup2重定向到一个临时文件,这很好用,但是当我用dup2将stdout重定向到fdArch并在temporal文件上运行sort时,out不是重定向到fdArch。是否存在概念错误或缺少某些内容?
您对dup2()
的使用很好,但确实存在重大错误:execv()
函数不会返回,除非它失败。它以及其系列中的所有其他函数替换使用指定的程序调用它的程序。因此,实际上您永远不会再次重定向stdout
或运行/bin/sort
。如果您想要执行这些操作,那么您应该fork()
,在子流程中执行execv()
,并让父级wait()
完成,然后再继续。