linux中的Fork和exec几个子级

linux中的Fork和exec几个子级,c,linux,gcc,C,Linux,Gcc,我想从另一个进程分叉并执行多个进程。 我的父母代码是 /*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++){

我想从另一个进程分叉并执行多个进程。 我的父母代码是

/*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);
}
/*Daddy.c*/
#包括
#包括
#包括
#包括
内部主(空)
{
智力状态;
char*nChild;

对于(int i=0;i您需要让父进程等待所有子进程完成。如果没有,则假设有一个子进程等待完成,然后父进程退出。其他两个子进程呢?它们成为孤儿,因为它们的父进程不等待它们

pid_t wpid;
int status = 0;
.
.
while ((wpid = wait(&status)) > 0); // the parent waits for all the child processes 
这个代码完成了任务

/* 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);
}
/*daddy.c*/
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
int status=0;
char nChild[16];
pid_t wpid;
对于(int i=0;i0);
printf(“爸爸%d出去了!\n”,getpid());
出口(0);
}
正如@OnzOg在问题的评论中所说,分配
nChild
是主要问题。此外
execv
需要传递两次子名称,一次作为参数。
最后,为了改进代码,父进程需要等待所有进程完成。

你能更具体地说明你的问题吗?你的代码有几个问题,但更糟糕的可能是char*nChild;它是在没有分配的情况下编写的,由childrenUse共享。顺便说一句,我看到你的一些其他帖子中有都是很好的答案。如果答案有帮助,你应该通过点击左侧的勾号图标来接受。no@snr,其他帖子没有解决这个问题,因为他们没有在父进程中使用for循环来创建子进程。当我在循环中使用循环时,我的代码出现了问题。问题是没有分配*nChild。谢谢@O兹诺格
/* 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);
}