2017-04-21 67 views
0

我正在寫一個函數給我的外殼,我需要將輸出重定向到文件。例如,用戶寫入:ls -l >> filels -l應寫入文件。幾乎所有的東西都是正確的,但在第一次調用我的函數程序停止之後,我不能寫任何其他東西。下面我介紹我的功能,我將不勝感激任何線索來解決這個問題:自定義外殼在dup2後停止工作

void execute2(char *command, char **argv, char **argv2) 
{ 
    pid_t pid; 
    int status; 

    if ((pid = fork()) < 0) 
    {  
     printf("*** ERROR ***\n"); 
      exit(1); 
    } 
    else if (pid == 0) 
    {  
     close(1);  
     parse(command, argv, argv2); 
     int output = open(*argv2, O_APPEND | O_WRONLY); 
     dup2(output,1);  
     if (strcmp(argv[0], "exit") == 0) 
      exit(0);  
     if (execvp(*argv, argv) < 0) 
     {  
      printf("*** ERROR ***\n"); 
      exit(1); 
     } 
     close(output); 
    } 
    else 
    {         
     while (wait(&status) != pid); 
    } 
} 

command是命令從用戶使用,argv是指令和參數argv2是輸出文件的一部分。

+1

你應該在'dup2(output,1)'之後和'execvp()'之前關閉(輸出)' - 最好在'strcmp()'之前。沒有必要測試'execvp()'的返回值;它只在失敗時纔會返回。 –

+1

如果你想念孩子死於某種方式,你的等待循環將永遠旋轉。用於調試,捕獲和打印進程ID和狀態。爲了健壯;使用'int屍體; int狀態; while((corpse = wait(&status))!= -1 && corpse!= pid)printf(「Child%d exited with status 0x.4X \ n」,屍體,狀態);'。即使這樣也不完美;它忽略了處理信號的可能性,並且用'errno == EINTR'返回'-1'。至少這樣,你會知道發生了什麼。 –

+0

你打了什麼命令?如果你調用'ls',看起來這應該返回。如果您正在調用'cat'或其他任何會阻止從標準輸入讀取的內容,我希望它會運行,直到您發送信號。 –

回答

-2

@Jonathan Leffler我檢查了這一點,我認爲它沒有解決問題。我建議,當我第一次調用execute2時,它可以像我想的那樣工作,但我從來沒有完成過程。或者我不想做什麼

+0

這不能提供問題的答案。你可以[搜索類似的問題](http://stackoverflow.com/search),或者參考頁面右側的相關和鏈接問題來找到答案。如果你有一個相關但不同的問題,請[提出一個新問題](// stackoverflow.com/questions/ask),幷包含一個鏈接來幫助提供上下文。請參閱:[提問,獲得答案,無干擾](http://stackoverflow.com/tour) – Krease