2012-03-03 4 views
3

Я на Linux mint 12.Как запустить внешнюю программу?

Я хочу запустить программу usr/share/application/firefox, а затем передать строку в любом месте. Я не нашел решение для Linux, но из того, что я видел до сих пор, существует множество теорий для Windows.

size_t ExecuteProcess(std::wstring FullPathToExe, std::wstring Parameters, size_t SecondsToWait) 
{ 
    size_t iMyCounter = 0, iReturnVal = 0, iPos = 0; 
    DWORD dwExitCode = 0; 
    std::wstring sTempStr = L""; 

    /* - NOTE - You should check here to see if the exe even exists */ 

    /* Add a space to the beginning of the Parameters */ 
    if (Parameters.size() != 0) 
    { 
     if (Parameters[0] != L' ') 
     { 
      Parameters.insert(0,L" "); 
     } 
    } 

    /* The first parameter needs to be the exe itself */ 
    sTempStr = FullPathToExe; 
    iPos = sTempStr.find_last_of(L"\\"); 
    sTempStr.erase(0, iPos +1); 
    Parameters = sTempStr.append(Parameters); 

    /* CreateProcessW can modify Parameters thus we allocate needed memory */ 
    wchar_t * pwszParam = new wchar_t[Parameters.size() + 1]; 
    if (pwszParam == 0) 
    { 
     return 1; 
    } 
    const wchar_t* pchrTemp = Parameters.c_str(); 
    wcscpy_s(pwszParam, Parameters.size() + 1, pchrTemp); 

    /* CreateProcess API initialization */ 
    STARTUPINFOW siStartupInfo; 
    PROCESS_INFORMATION piProcessInfo; 
    memset(&siStartupInfo, 0, sizeof(siStartupInfo)); 
    memset(&piProcessInfo, 0, sizeof(piProcessInfo)); 
    siStartupInfo.cb = sizeof(siStartupInfo); 

    if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()), 
          pwszParam, 0, 0, false, 
          CREATE_DEFAULT_ERROR_MODE, 0, 0, 
          &siStartupInfo, &piProcessInfo) != false) 
    { 
     /* Watch the process. */ 
     dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (SecondsToWait * 1000)); 
    } 
    else 
    { 
     /* CreateProcess failed */ 
     iReturnVal = GetLastError(); 
    } 

    /* Free memory */ 
    delete[]pwszParam; 
    pwszParam = 0; 

    /* Release handles */ 
    CloseHandle(piProcessInfo.hProcess); 
    CloseHandle(piProcessInfo.hThread); 

    return iReturnVal; 
} 

Вы можете увидеть много теорий here первого ответа описывает, как сделать это для Linux с C, я хочу сделать это с C++, я прибегая к помощи в течение нескольких часов, и я видел много теорий. У этой темы есть больше теорий, чем квантовая физика. :)

Я парень на Python, потому что мне нравится простота, поэтому, пожалуйста, дайте простой код, который будет работать на 32 и 64 бит, если это возможно.

Я хотел бы сделать что-то вроде, если usr/share/application/firefox доступен, запустить его, иначе запустить usr/share/application/googlechrome

И не могли бы вы сказать мне, почему не может тот же самый код запустить на Mac и Windows?

+2

Я начал редактирование, но я думаю, что есть слишком много плохого с ним, чтобы спасти. Можете ли вы его очистить, включая добавление базовой капитализации и орфографии? Какой у Вас вопрос? Это не веб-сайт или сайт «дай мне код». –

+0

Все, что сделано в C, может (почти всегда) также выполняться на C++, поэтому поиск решения на C будет почти всегда компилироваться вместе с C++. Здесь также есть * более одного вопроса *. –

+4

Если вы используете std :: wstring, то тег «c» немного ошибочен. –

ответ

7

Это может быть сделано с помощью либо system, который является таким же, как вызов os.system в Python или fork и execl или popen, который похож на вызов subprocess.Popen в Python.

Некоторые примеры приведены ниже. Они должны работать на Linux или Mac.

Для Windows используйте _system и _popen вместо этого, используя, если определена функция препроцессора C.

IFDEF Пример

#ifdef __unix__ /* __unix__ is usually defined by compilers targeting Unix systems */ 
# callto system goes here 
#elif defined _WIN32 /* _Win32 is usually defined by compilers targeting 32 or 64 bit Windows systems */ 
# callto _system goes here 
#endif 

Они зависят от архитектуры, хотя расположение двоичного файла Firefox не может быть на различных системах.

система

#include <stdio.h> 
#include <stdlib.h> 
int main(int argc, char **argv) 
{ 
    system("/usr/share/application/firefox"); 
    printf("Command done!"); 
    return 0; 
} 

POPEN

#include <stdio.h> 
int main(int argc, char **argv)) 
{ 
    FILE *fpipe; 
    char *command="/usr/share/application/firefox"; 
    char line[256]; 

    if (!(fpipe = (FILE*)popen(command,"r"))) 
    { // If fpipe is NULL 
     perror("Problems with pipe"); 
     exit(1); 
    } 

    while (fgets(line, sizeof line, fpipe)) 
    { 
    printf("%s", line); 
    } 
    pclose(fpipe); 
    return 0; 
} 
Смежные вопросы