我必须创建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);
}
答案 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()
失败时运行,在这种简单的情况下,它失败的唯一方法就是你提供了不正确的论据。