#c #windows #shell #visual-studio-code
#c #Windows #оболочка #visual-studio-code
Вопрос:
Я ищу способ запустить приложение с помощью popen и не дожидаюсь завершения процесса. Например, как и VS Code.
#include <string>
#include <cstdlib>
#include <cstdio>
#include <memory>
#include <stdexcept>
#include <iostream>
using namespace std;
string exec(const char *cmd)
{
std::array<char, 128> buffer;
string resu<
auto pipe = popen(cmd, "r");
if (!pipe)
{
throw std::runtime_error("popen() failed!");
}
cout << "Opened pipe" << endl;
while (!feof(pipe)){
cout << "inside while loop" << endl;
if (fgets(buffer.data(), 128, pipe) != nullptr){
cout << "reading pipe" << endl;
result = buffer.data();
}
}
auto rc = pclose(pipe);
return resu<
}
int main(){
exec("code");
//exec(".\launchApp.sh");
cout << "finished" << endl;
}
Этот код запустит приложение «VS Code» и завершит выполнение. «VS Code» останется в живых.
Если я попытаюсь запустить другое приложение (я перепробовал миллионы приложений), выполнение будет зависать в «журнале» «внутри цикла while», пока пользователь не закроет приложение. После закрытия выполнение будет завершено.
Чего я хочу достичь?
Я хочу запустить приложение в popen pipe, завершить выполнение кода и оставить приложение в рабочем состоянии.
Что я пробовал?
Я уже пытался выполнить в сценарии оболочки (launchApp.sh ) приложение в фоновом режиме и, как cmd, выполняет «запуск.launchApp.sh «. Не работает. Я прочитал сценарий выполнения VS code, который выглядит как обычная вещь.
Комментарии:
1. Ваша программа ожидает внутри цикла вечно, потому что канал будет блокироваться (точно так же, как это делает stdin), если вы ожидаете ввода и читать нечего. Поэтому не вызывайте fgets, если вы не знаете, что есть что почитать. Существует множество способов, но один из них — вызвать
fcntl(pipe, F_SETFL, O_NONBLOCK)
2. @JerryJeremiah, не могли бы вы, пожалуйста, исправить мой код в ответах на этот вопрос? Я не уверен, как реализовать ваше решение