Как выполнить файл a.out с помощью семейства функций exec в Linux - PullRequest
1 голос
/ 16 октября 2019

Цель этой программы на С ++ - понять механизм параллельных процессов в операционной системе. А следующий код предназначен для дочерних функций одного процесса. И у дочернего процесса есть их номера, № 5 и № 6.

Я пытаюсь использовать файл a.out в процессе № 6. Я пытаюсь сделать это следующим образом.

void ChildFunction_For_ProcessNO.4(int i){
    switch(i){
        case(5):
            cout << "This is process five, and the ID for this process is " << getpid() << '\n'
                 << "and the ID for the parent process is " << getppid() << '\n';
            CreateThreads_Five();
            cout << "Process five has ended.\n" << '\n';
            break;
        case(6):
            cout << "This is process six, and the ID for this process is " << getpid() << '\n'
                 << "and the ID for the parent process is " << getppid() << '\n';
            execl("./a.out", "a.out", NULL);
            //and I also tried this way
            execl("Home/CLionProjects/Project_1/a.out", "a.out", NULL);
            char buf[100]; 
            cout << "getcwd: " << getcwd(buf, sizeof(buf))) << endl;
            cout << "Process six has ended.\n";
            break;
    }

и вывод getcwd выглядит следующим образом

getcwd: /home/chengxuyuan/CLionProjects/Project_1/cmake-build-debug

Файл a.out уже был помещен в папку вместе сС ++ программа. снимок экрана рабочего каталога и компиляция прошла успешно, но просто нет вывода, который должен быть Hello world из файла a.out. Как я могу решить эту проблему. Большое спасибо!

1 Ответ

0 голосов
/ 16 октября 2019

Вывод getcwd показывает, что вы должны поместить свой файл a.out в

/home/chengxuyuan/CLionProjects/Project_1/cmake-build-debug

Ваша попытка

execl("Home/CLionProjects/Project_1/a.out", "a.out", NULL);

неверна, это не полный путь. Вы должны будете использовать

execl("/home/chengxuyuan/CLionProjects/Project_1/a.out", "a.out", NULL);

КСТАТИ: Вы должны указать то же значение, что и аргумент 0, который вы используете для запуска программы, т.е.

execl("/home/chengxuyuan/CLionProjects/Project_1/a.out", "/home/chengxuyuan/CLionProjects/Project_1/a.out", NULL);

или

execl("./a.out", "./a.out", NULL);

Это то, что будет делать оболочка и чего ожидает большинство программ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...