Я новичок в программировании, особенно в программировании 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
Чтение из трубы процесса Shell и застрять ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Что делает терминал застрять при попытке запустить проект в моей среде разработки?
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
-