запустить приложение на c popen (), как это делает VS Code

#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, не могли бы вы, пожалуйста, исправить мой код в ответах на этот вопрос? Я не уверен, как реализовать ваше решение