Чтение из технологического канала оболочки и застревание [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Чтение из технологического канала оболочки и застревание [закрыто]

Сообщение Anonymous »

Я новичок в программировании, особенно в программировании UNIX, и для моей конкретной задачи я использую две трубы для чтения и написания из/до раздвоенного процесса с выполнением оболочки.
Есть программа, с которой мне нужно общаться, но у нее нет API, поэтому я отправляю команды в оболочку, а затем вот проблема < /p>
, когда процесс получает команду, и команда выполняет Я пытаюсь получить результат, и вот оно, но нет EOF, а FGETS никогда не заканчивается (не в цикле!) < /P>
while(fgets(buffer, sizeof(buffer), readPipe)) {
result += buffer;
}

Когда напечатана последняя строка, следующая строка в буфере выглядит следующим образом.
fgets
Потому что после выполнения команды она переходит на новую пустая строка.
Можете ли вы мне помочь, как избежать таких ошибок, как && buffer[0]!='\n', возможно, вместо этого использовать fgets или способ чтобы понять, что fgets получил стек, или может быть вы думаете, как все описано решение - ляп...
В любом случае был бы признателен за ответ
Методы класса
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 МБ.

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