Перенаправление ввода с использованием dup2 () - PullRequest
0 голосов
/ 03 октября 2018

Поэтому я пытаюсь реализовать следующий оператор командной строки в c ++, используя 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);

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

1 Ответ

0 голосов
/ 03 октября 2018

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

Вы также можете захотеть:

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

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

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