Перенаправление ввода с помощью dup2()

Итак, я пытаюсь реализовать следующий оператор командной строки на С++, используя dup2() и execvp(): wc < inputFile.txt затем вернитесь в мою командную строку. Итак, в основном я разветвляю процесс и выполняю эту команду в дочернем процессе. Однако в моем коде следующая ошибка: wc: stdin: read: Bad file descriptor

Вот мой код:

int file_desc = open(fileName.c_str(), O_WRONLY | O_APPEND); 
int stdin = dup(0);
dup2(file_desc,0); 
execvp (args2[0], args2); // now execute
dup2(stdin, 0);

Таким образом, мой мыслительный процесс заключался в том, что мне нужно было перенаправить стандарт in (он же индекс 0 таблицы дескрипторов файлов) на файловый дескриптор файла, поскольку в индексе всегда используется стандартный ввод, и именно отсюда считываются входные данные. Затем, после выполнения, я заменяю его исходным стандартом. Поэтому я не понимаю, что я делаю неправильно.


person Papes Traore    schedule 03.10.2018    source источник
comment
Ваш фактический код проверяет/проверяет возвращаемое значение каждой функции, которую он вызывает, верно? Потому что в противном случае любой из них мог бы возвращать код ошибки, и вы бы этого не знали.   -  person Jeremy Friesner    schedule 03.10.2018


Ответы (1)


File_desc открыт только для записи (O_WRONLY) — попробуйте открыть его для чтения (O_RDONLY).

Вы также можете:

  • dup2() между fork() и exec() вместо сохранения и восстановления стандартного ввода - меньше системных вызовов и экономит гонку в многопоточных приложениях.

  • закрыть file_desc в родительском процессе

  • закрыть file_desc в дочернем процессе после dup2 (и до exec)
person Uri Simchoni    schedule 03.10.2018