如何 运行 多个 children 执行不同的任务?
how to run multiple children with different tasks?
我的程序必须创建多个 children,我从终端获取 children 的数量。然后,我需要将它们分组,每个组都有不同的任务。
我创建了children,但问题是我不能给他们单独的任务,我无法区分children。我唯一能做的就是,每个 children 都在同一部分工作(比如打印 pids)。
如何将他们分开并分配给他们特定的任务?
例如,前 4 个 children 应该调用一个函数,其他 3 个应该打印一些东西,另外 3 个应该写入一个文件等。
pid_t pid[10];
pid[0] = fork();
if(pid[0] > 0)
{
for(int i = 0; i < 9; i++)
{
if(pid[i] > 0)
{
pid[i + 1] = fork();
}
}
}
for(int i = 0; i < 10; i++)
{
if(pid[i] == 0)
{
printf("child %d, parent %d\n", getpid(), getppid());
exit(1);
}
}
我认为您应该看一下 fork()
函数的工作原理。这是 man page, here a useful answer and here a useful tutorial.
当您在代码中使用 fork()
时,要知道子进程从父进程所在的位置继续。因此,当您在第一个 for
循环中调用 fork()
时,所有子进程都会继续父进程已经开始的循环。我认为这不是您期望的行为。
无论如何,这里有一个可能解决您的问题的方法。通过这种方式,您的流程会做一些分成小组的事情。请注意工作结束时的 exit(0)
函数。重要的是要确保每个进程只做它的工作而不是它父进程的工作:
pid_t pid[10];
for (int i = 0; i < 9; i++)
{
pid[i] = fork();
//First group
if (pid[i] == 0 && i < 4){
//Insert here the code for the first group or call a fuction
exit(0);
}
//Second group
if (pid[i] == 0 && i >=4 && i < 8){
//Insert here the code for the second group or call a fuction
exit(0);
}
//Third group
if (pid[i] == 0 && i >=8){
//Insert here the code for the third group or call a fuction
exit(0);
}
if (pid[i] < 0){
perror("Something wrong with the fork");
exit(1);
}
}
int flag = 0;
flag |= (fork() == 0) << 0;
flag |= (fork() == 0) << 1;
flag |= (fork() == 0) << 2;
printf("this process works on problem %d\n", flag);
我的程序必须创建多个 children,我从终端获取 children 的数量。然后,我需要将它们分组,每个组都有不同的任务。
我创建了children,但问题是我不能给他们单独的任务,我无法区分children。我唯一能做的就是,每个 children 都在同一部分工作(比如打印 pids)。
如何将他们分开并分配给他们特定的任务?
例如,前 4 个 children 应该调用一个函数,其他 3 个应该打印一些东西,另外 3 个应该写入一个文件等。
pid_t pid[10];
pid[0] = fork();
if(pid[0] > 0)
{
for(int i = 0; i < 9; i++)
{
if(pid[i] > 0)
{
pid[i + 1] = fork();
}
}
}
for(int i = 0; i < 10; i++)
{
if(pid[i] == 0)
{
printf("child %d, parent %d\n", getpid(), getppid());
exit(1);
}
}
我认为您应该看一下 fork()
函数的工作原理。这是 man page, here a useful answer and here a useful tutorial.
当您在代码中使用 fork()
时,要知道子进程从父进程所在的位置继续。因此,当您在第一个 for
循环中调用 fork()
时,所有子进程都会继续父进程已经开始的循环。我认为这不是您期望的行为。
无论如何,这里有一个可能解决您的问题的方法。通过这种方式,您的流程会做一些分成小组的事情。请注意工作结束时的 exit(0)
函数。重要的是要确保每个进程只做它的工作而不是它父进程的工作:
pid_t pid[10];
for (int i = 0; i < 9; i++)
{
pid[i] = fork();
//First group
if (pid[i] == 0 && i < 4){
//Insert here the code for the first group or call a fuction
exit(0);
}
//Second group
if (pid[i] == 0 && i >=4 && i < 8){
//Insert here the code for the second group or call a fuction
exit(0);
}
//Third group
if (pid[i] == 0 && i >=8){
//Insert here the code for the third group or call a fuction
exit(0);
}
if (pid[i] < 0){
perror("Something wrong with the fork");
exit(1);
}
}
int flag = 0;
flag |= (fork() == 0) << 0;
flag |= (fork() == 0) << 1;
flag |= (fork() == 0) << 2;
printf("this process works on problem %d\n", flag);