Я хотел бы изменить дескриптор файла, чтобы мои команды execvp
отправлялись в файл. После этого я хотел бы сбросить stdout
обратно в консоль.
Это то, что у меня есть до сих пор:
int main() {
printf("to console\n");
int stdoutfd = dup(STDOUT_FILENO);
FILE* file = fopen("./test.txt","ab+");
int filefd = fileno(file);
dup2(filefd,STDOUT_FILENO);
char *args[] = {"ls","-la",NULL};
execvp(args[0],args);
dup2(stdoutfd,STDOUT_FILENO);
close(stdoutfd);
printf("to console\n");
}
Первый printf
печатает в консоль, затем execvp по командам «ls -la» печатается в файл test.txt
, но моя проблема в том, что второй printf
нигде не печатает.
Я понимаю, что на аналогичный вопрос был дан ответ в C восстановить стандартный вывод на терминал, но это решение не работает.
execvp
не возвращается в случае успеха.execvp
заменяет текущий образ процесса новым образом процесса. То есть, если нет ошибки с вызовомexecvp
, ни один код послеexecvp
никогда не будет выполняться. Вы, вероятно, захотите сначалаfork
перед вызовомexecvp
. - person kaylum   schedule 30.09.2016fork()
, поэтому после успешногоexecvp()
ничего не выполняется. Последние три строки никогда не выполняются, если работаетexecvp()
. Вы можете изменить строку"ls"
на"not-the-ls"
(конечно, при условии, что у вас нет команды с именемnot-the-ls
) и перезапустить; тогда вы увидите сообщениеto console
. - person Jonathan Leffler   schedule 30.09.2016exec*()
возвращает значение, это когда она не смогла выполнить то, что ее попросили выполнить. - person Jonathan Leffler   schedule 30.09.2016