Так что я пишу простую оболочку в C, которая может перенаправлять STDOUT. Я читаю строку от пользователя, разделяю ее в аргументах, а затем кормлю ее для выполнения в значительной степени. Но когда я перенаправляю вывод, он 1st: создает файл, который я запросил, и заполняет его правильными данными, а затем выводит результаты команды в терминал бесконечно. Я делаю что-то неправильно с dup2?Перенаправление оболочки вызывает бесконечную печать на терминал
Это мой перенаправляющий код. Все используемые переменные являются глобальными, за исключением дескриптора файла.
int execRedirectCommand(){
int fd;
pid_t pid = fork();
// fork failed
if(pid == -1){
char* error = strerror(errno);
printf("fork: %s\n", error);
return -1;
}
//Child process
else if(pid == 0){
fd = open(fileName, O_WRONLY | O_CREAT | O_TRUNC, 0755);
if(fd == -1){
char* error = strerror(errno);
printf("open:%s\n", error);
return -1;
}
dup2(fd, STDOUT_FILENO);
close(fd);
execvp(payloadArgv[0], payloadArgv);
// execvp failed
char* error = strerror(errno);
printf("pdsh:%s:%s\n", payloadArgv[0], error);
return -1;
}
// Parent process
else{
close(fd);
fileName = NULL;
// Wait for child process to finish
int childStatus;
waitpid(pid, &childStatus, 0);
return 0;
}
}
EDIT Исправлена опечатка в коде ничего серьезного. EDIT 2 Включая мое главное:
int main(){
setSigHandler();
char* user = getlogin();
while(1){
printf("[%s]-->$", user);
getNextCommand(payload);
if(!strcmp(payload, "\n")) continue;
if(!strcmp(payload, "close")) break;
parseCommandString();
if(fileName != NULL){
execRedirectCommand();
}else{
execSimpleCommand();
}
}
return 0; }
Примечание: команды без STDOUT Перенаправление работы просто отлично.
Возможно, проблема в том, что холод вызывает эту функцию? Единственное, что я могу заметить, это неправильно, так это то, что вы закрываете 'fd' в процессе обработки, где он никогда не был открыт/инициализирован. – mata
@mata, поскольку я forking не родитель также получить копию файла? EDIT: добавил мой главный. – Akaitenshi
@meta хорошо кажется, что исправил проблему, но мой вопрос остается: не родитель ли получить копию файла тоже? – Akaitenshi