Чтение из трубы процесса Shell и застрятьC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Чтение из трубы процесса Shell и застрять

Сообщение Anonymous »

Я новичок в программировании, особенно в программировании UNIX, и для моей конкретной задачи я использую две трубы для чтения и написания из/до раздвоенного процесса с выполнением оболочки.
Есть программа, с которой мне нужно общаться, но у нее нет API, поэтому я отправляю команды в оболочку, а затем вот проблема < /p>
, когда процесс получает команду, и команда выполняет Я пытаюсь получить результат, и вот оно, но нет EOF, а FGETS никогда не заканчивается (не в цикле!) < /P>
while(fgets(buffer, sizeof(buffer), readPipe)) {
result += buffer;
}
< /code>
Когда последняя напечатана строка, следующая то, что в буфере выглядит так. пустая строка.
Можете ли вы помочь мне, как избежать Kludges, таких как Buffer [0]! Чтобы понять, что FGETS получил стек, или, может быть, вы думаете, что все описанные решения - Kludge ...
В любом случае оцените ответ
Методы класса
CommandExecutor::CommandExecutor() {
int writePipeFd[2];
int readPipeFd[2];

if(pipe(writePipeFd) || pipe(readPipeFd)) throw std::runtime_error("create pipe: failed!");

processID = fork();

if (processID == -1) throw std::runtime_error("failed!");
else if(processID == 0) {
if (dup2(readPipeFd[1], STDOUT_FILENO) < 0) throw std::runtime_error("dup to stdout: failed!");
if (dup2(writePipeFd[0], STDIN_FILENO) < 0) throw std::runtime_error("dup to stdout: failed!");

close(writePipeFd[0]);
close(writePipeFd[1]);
close(readPipeFd[0]);
close(readPipeFd[1]);

execlp("/bin/sh", "sh", nullptr);
perror("error occured when exec!");
exit(1);

} else {
close(readPipeFd[1]);
close(writePipeFd[0]);

writePipe = fdopen(writePipeFd[1], "w");
readPipe = fdopen(readPipeFd[0], "r");

if (!writePipe || !readPipe) throw std::runtime_error("open read/write pipe: failed!");

}

}

CommandExecutor::~CommandExecutor() {
if (writePipe) fclose(writePipe);
if (readPipe) fclose(readPipe);

if (processID > 0) {
int status;
waitpid(processID, &status, 0);
if (WIFEXITED(status)) std::cerr

Подробнее здесь: https://stackoverflow.com/questions/793 ... ting-stuck
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Что делает терминал застрять при попытке запустить проект в моей среде разработки?
    Anonymous » » в форуме Javascript
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Multiprocessing Value () Ctypes.c_wchar_p причина причина застрять, альтернатива?
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Чтение значения размера компонента трубы с использованием .NET C# на AutoCAD PLANT 3D
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Означает ли `shell` в `shell=True` в подпроцессе `bash`?
    Anonymous » » в форуме Python
    0 Ответы
    50 Просмотры
    Последнее сообщение Anonymous
  • Почему подпроцесс требует двух вызовов.) Вызов (), когда Shell = false, но только один с Shell = true?
    Anonymous » » в форуме Python
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»