Linux, как порождать дочерний процесс, используя параметр из argv[] в C

Я хочу создать программу msh, которая будет распознавать некоторые другие написанные мною программы на C, создавать новый процесс для этой программы на C и запускать ее.

Например, я уже написал свои собственные функции копирования, перемещения и удаления с именами mycopy, myremove и mymove.

Я хочу иметь возможность делать./msh mycopy file1 file2 И заставить msh порождать новый процесс, запускать mycopy и выполнять действие, а затем дождаться завершения этого дочернего процесса перед выходом.

Я попробовал то, что вы видите ниже, и оно компилируется, но, похоже, фактически не выполняет задачи. Какие-либо предложения? Я никогда раньше не использовал fork(), execl() или wait(), поэтому я мог пропустить и включить или параметр, пожалуйста, исправьте меня, если я ошибаюсь.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>

int main(int argc, char* argv[]){

int pid;

if(strcmp(argv[1], "mycopy") == 0){
    if(pid = fork() == 0){
        execl("/home/1234/mycopy", argv[2], argv[3]);
    }
}

if(strcmp(argv[1], "myremove") == 0){
    if(pid = fork() == 0){
        execl("/home/1234/myremove", argv[2]);
    }
}

if(strcmp(argv[1], "mymove") == 0){
    if(pid = fork() == 0){
        execl("/home/1234/mymove", argv[2], argv[3]);
    }
}

if(pid > 0){
    wait((int*)0);
}

return 0;
}

Я попробовал это и работал 3 печатных дважды. Означает ли это, что моя команда execl не работает, и если да, то как бы это исправить, так как argv[2] и argv[3] должны быть переданы в./mycopy

    int pid = fork();
    if(strcmp(argv[1], "mycopy") == 0){
            if(pid  == 0){
                    printf("WORKING1");
                    execl("/home/1234/mycopy", argv[2], argv[3]);
                    printf("WORKING2");
            }
    }
     wait((int*)0);
    printf("WORKING3");
    return 0;

1 ответ

Форкинг всегда кажется немного запутанным для новичков. На самом деле происходит то, что, когда вы возвращаетесь из fork() теперь у вас есть два процесса (родительский и дочерний), оба из которых только что вернулись из fork() и оба из которых собираются выполнить следующий оператор.

Обычная идиома это позвонить int child_pid = fork() а затем проверить child_pid определить, являюсь ли я дочерним процессом (child_pid == 0) или родительский процесс (child_pid != 0) и нести либо exec()или wait()в зависимости от обстоятельств.

Вы не сделали этот тест; оба ваших процесса пытаются выполнить оба поведения.

Этого должно быть достаточно, чтобы вы встали на правильный путь.

РЕДАКТИРОВАТЬ: я только что скомпилировал следующее:

/**
* @file     msh.c
* @brief    fork/execl example
*/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>

int main(int argc, char* argv[])
{

    int pid;


    if ((pid = fork()) == 0)
    {
        if(strcmp(argv[1], "mycopy") == 0)
        {
            {
                execl("./hello", "./hello", argv[2], argv[3], NULL);
            }
        }

        if(strcmp(argv[1], "myremove") == 0)
        {
            {
                execl("./hello", "./hello", argv[2], NULL);
            }
        }

        if(strcmp(argv[1], "mymove") == 0)
        {
            {
                execl("./hello", "./hello", argv[2], argv[3], NULL);
            }
        }
    }
    else
    {
        wait(NULL);
    }

    return 0;
}

(отредактировано снова) и

/**
* @file     hello.c
* @brief    test load for msh
*/

#include <stdio.h>

int main(int argc, char* argv[])
{
    int i;
    for (i = 0; i < argc; i++)
        printf("Argc[%d] = %s\n", i, argv[i]);
    return 0;
}

и это работает, так что, возможно, проблема в вашем дочернем коде?

Я заметил что execl() передает свой второй аргумент как ребенка argv[0], так что это может вызвать у вас проблемы.

Другие вопросы по тегам