结合fork execl等待

时间:2014-03-22 12:25:04

标签: c linux

我必须创建prog1,其中包含一个带有子数的参数必须创建。 (示例" ./ prog1 5" - 将创建5个孩子)每个孩子将生成从1到20的随机数。这个数字将被给予execl,它将启动prog2(在同一文件夹中)一个参数这个随机数。 Prog2应该在这个随机数时间内休眠。之后,它应该将此随机数返回给父母 我创造了这样的东西,但它仍然无法正常工作。

PROG1:

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

int main(int argc, char *argv[])
{
    int n, i, pid;
    int u = getppid();
    int procesy = 0;

    pid_t proc_id;

    n = atoi(argv[1]);

    for(i = 0; i < n; i++)
    {
        proc_id = fork();

        if(proc_id==0)
        {
            srand(getpid());
            u = 1 + rand()%20;
            execl("./prog2", "prog2", u,0);

        }
        else
        {
            procesy++;
        }
    }

    if(u == getppid())
    {
        for(i = 0; i < n; i++)
        {
            pid = wait(&u);
            printf("Process %d ende\n", pid);
            procesy--;
        }

        if(procesy == 0) printf("endc\n");
    }
    return 1;
}

PROG2:

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

    int main(int argc, char *argv[])
    {
      int n;
      n = atoi(argv[1]);
      sleep(n);

      exit(n);
    }

1 个答案:

答案 0 :(得分:1)

将循环更改为类似以下内容,以便正确调用execl():

if(proc_id==0)
{
    char arg[16];
    srand(getpid());
    sprintf(arg, "%d", 1 + rand()%20);
    execl("./prog2", "prog2", arg, 0);
    printf("I should not be here!\n");
    exit(-1);
}

然后摆脱if(u == getppid())(但保留条件的内容)。似乎if你试图过滤掉孩子运行那个块。当execl()有效时,孩子不会在execl()之后在此代码中运行任何 ...我将添加我添加的printf和退出。这些行只会在execl()失败时运行,在这种简单的情况下,它失败的唯一方法就是你提供了不正确的论据。