Я новичок в программировании, особенно в программировании 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++
Программы на C++. Форум разработчиков
1738854824
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79378040/reading-from-shell-process-pipe-and-getting-stuck[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия