2012-01-30 40 views
2

我不知道我做错了......但这里是正在执行的代码片段:重定向execvp的输出到一个文件用C

if (fork() == 0) 
    {  
      // child 
     int fd = open(fileName, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); 

     dup2(fd, 1); // make stdout go to file 

     execvp("ls","ls"); 
     close(fd); 
      exit(0); 
    } 
if(wait(&status) == -1) 
    { 
     printf("ERROR REDIRECT\n"); 
    } 

fileName被创建,但有里面什么都没有。我做错了什么?

+1

您没有正确调用'execvp'。 – dreamlax 2012-01-30 20:20:05

+0

您是否尝试过没有'dup2'的完全相同的代码?它应该打印到标准输出。这个测试可以帮助我们关注这个问题。 – ugoren 2012-01-30 20:56:44

+0

您是否考虑过执行命令“ls> $ filename”? – dbeer 2012-01-30 21:34:40

回答

4

我的猜测是,execvp不起作用,但由于你不处理错误,你没有看到它。

试试这个:

char *const args[] = {"ls", NULL}; 
execvp(args[0], args); 

/* If this is reached execvp failed. */ 

perror("execvp"); 

或者您可以使用复合文字:

execvp("ls", (char *[]){"ls", NULL}); 

设想二:尽量正常运行的东西,没有重定向,看看它是如何工作的。

+0

我试过了,没有打印出来......似乎'execvp'被成功执行了。 – user1162954 2012-01-30 20:23:08

+0

@ user1162954 - 你的execvp工作在世界上没有机会。采取cnicutar修复和你的东西将工作。 – Duck 2012-01-31 01:17:11

0

在execvp之前关闭fd。 ,因为execvp之后的代码永远不会运行,除非execvp失败。