我正在寫一個函數給我的外殼,我需要將輸出重定向到文件。例如,用戶寫入:ls -l >> file
和ls -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
是輸出文件的一部分。
你應該在'dup2(output,1)'之後和'execvp()'之前關閉(輸出)' - 最好在'strcmp()'之前。沒有必要測試'execvp()'的返回值;它只在失敗時纔會返回。 –
如果你想念孩子死於某種方式,你的等待循環將永遠旋轉。用於調試,捕獲和打印進程ID和狀態。爲了健壯;使用'int屍體; int狀態; while((corpse = wait(&status))!= -1 && corpse!= pid)printf(「Child%d exited with status 0x.4X \ n」,屍體,狀態);'。即使這樣也不完美;它忽略了處理信號的可能性,並且用'errno == EINTR'返回'-1'。至少這樣,你會知道發生了什麼。 –
你打了什麼命令?如果你調用'ls',看起來這應該返回。如果您正在調用'cat'或其他任何會阻止從標準輸入讀取的內容,我希望它會運行,直到您發送信號。 –