Поэтому я пытаюсь реализовать следующий оператор командной строки в 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, и именно из него читается входная информация. Затем, после выполнения, я заменяю его обратно на исходный стандарт. Поэтому я не понимаю, что делаю неправильно.
Файл_desc открывается только для записи (O_WRONLY) — попробуйте открыть его для чтения (O_RDONLY).
Вы также можете захотеть:
dup2 () между fork () и exec () вместо того, чтобы сохранять и восстанавливать системные вызовы без stdin и спасает гонку в многопоточных приложениях.
закрыть file_desc в родительском процессе
Других решений пока нет …