Форк и exec несколько детей в Linux - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу раскошелиться и выполнить несколько процессов из другого.Мой родительский код -

/*Daddy.c*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
    int main(void)
{
        int status;
        char *nChild;

        for (int i=0; i<3;i++){
            int pid = fork();
            if (pid == 0)
            {
                sprintf(nChild, "%d", i);
                printf("%d\n", i);
                char *const arguments[]={nChild, NULL};
                fflush(NULL);
                execv("child",arguments);
                printf("\nNo , you can't print!\n");
            }else if (pid == -1){
                    printf("%d\n", getpid());
                    exit(0);
            }
        }
        wait(&status);
        printf("Dad %d went out!\n", getpid());
        exit(0);
}

, а мой дочерний процесс -

    /*child.c*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int args, char **argv){
        if( args !=2){
                printf("Child going away!\n");
                exit(1);
        }
        printf("Child %s: %d going away stylishly!\n", argv[1], getpid());

        exit(0);
}

Когда я не создаю три вилки, но одну, я знаю, как создать ребенка, сделайте некоторую работуи выход от ребенка и родителя.Но в этом случае с несколькими детьми кажется, что ребенок никогда не казнит.Из-за строки wait(&status) я действительно надеялся, что когда выходит первый ребенок, родитель тоже выходит, но любой ребенок печатает любое сообщение. Некоторые соответствующие предыдущие вопросы не помогли.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Этот код сделал свою работу

/* daddy.c */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
int main(void)
{
        int status=0;
        char nChild[16];
        pid_t wpid;
        for (int i=0; i<3;i++){
            sprintf(nChild, "%d", i);
            int pid = fork();
            if (pid == 0)
            {
                printf("%s\n", nChild);
                char *const arguments[]={"child", nChild, NULL};
                fflush(NULL);
                execv("child",arguments);
                printf("\nNo , you can't print!\n");
            }else if (pid == -1){
                    printf("%d\n", getpid());
                    exit(0);
            }
        }
        while ((wpid=wait(&status)) >0);
        printf("Dad %d went out!\n", getpid());
        exit(0);
}

Как сказал @OnzOg в комментариях к вопросу, выделение nChild было основной проблемой.Также execv необходимо передать дочернее имя дважды, один в качестве аргумента.И, наконец, для улучшения кода родительский процесс должен дождаться завершения всех процессов.

0 голосов
/ 28 ноября 2018

Вам нужно заставить родителей ждать завершения всех дочерних процессов.Если нет, предположим, что 1 ожидающий ребенок завершен, а затем родитель завершает работу.Как насчет двух других детей?Они становятся сиротами, так как их родители не ждут их.

pid_t wpid;
int status = 0;
.
.
while ((wpid = wait(&status)) > 0); // the parent waits for all the child processes 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...