2012-01-30 2 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

+0

Пробовал ли вы один и тот же код без 'dup2'? Он должен печатать до стандартного вывода. Этот тест может помочь сосредоточиться на проблеме. – ugoren

+0

Вы считали exec'ing командой «ls> $ filename»? – dbeer

ответ

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

+0

@ user1162954 - В мире нет возможности работать с вашим execvp. Возьмите cnicutar fix, и ваши вещи будут работать. – Duck

0

закрыть fd before execvp. , потому что код после execvp никогда не запускается, если execvp не сработает.

Смежные вопросы