gpt4 book ai didi

通过 fork() 在 C 中创建多个进程和模拟

转载 作者:太空宇宙 更新时间:2023-11-04 01:42:35 24 4
gpt4 key购买 nike

我想创建多个将调用不同函数的进程组。

我写下面的代码。首先我想获得以下输出

./fork 4 5

 I am a child: 1 PID: 22330
I am a child2: 1 PID: 22334
I am a child: 2 PID: 22331
I am a child2: 5 PID: 22338
I am a child: 4 PID: 22333
I am a child: 3 PID: 22332
I am a child2: 2 PID: 22335
I am a child2: 4 PID: 22337
I am a child2: 3 PID: 22336

'

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void forkChildren (int nChildren) {
int i;
pid_t pid;
for (i = 1; i <= nChildren; i++) {
pid = fork();
if (pid == -1) {
/* error handling here, if needed */
return;
}
if (pid == 0) {
printf("I am a child: %d PID: %d\n",i, getpid());
sleep (5);
wait(NULL);
return;
}
}
}
void forkChildren2 (int nChildren) {
int i;
pid_t pid;
for (i = 1; i <= nChildren; i++) {
pid = fork();
if (pid == -1) {
/* error handling here, if needed */
return;
}
if (pid == 0) {
printf("I am a child2: %d PID: %d\n",i, getpid());
sleep (2);
return;
}
}
}

int main (int argc, char *argv[]) {

forkChildren (atoi (argv[1]));
forkChildren2 (atoi (argv[2]));

return 0;
}

代码给了我输出

[ozdeny@hyperion ~]$ ./fork 4 5
I am a child: 1 PID: 22330
I am a child: 2 PID: 22331
I am a child: 3 PID: 22332
I am a child: 4 PID: 22333
I am a child2: 1 PID: 22334
I am a child2: 2 PID: 22335
I am a child2: 4 PID: 22337
I am a child2: 5 PID: 22338
[ozdeny@hyperion ~]$ I am a child2: 3 PID: 22336
I am a child2: 1 PID: 22339
I am a child2: 2 PID: 22340
I am a child2: 3 PID: 22341
I am a child2: 4 PID: 22342
I am a child2: 5 PID: 22343
I am a child2: 1 PID: 22345
I am a child2: 2 PID: 22346
I am a child2: 3 PID: 22347
I am a child2: 1 PID: 22349
I am a child2: 2 PID: 22350
I am a child2: 1 PID: 22344
I am a child2: 2 PID: 22352
I am a child2: 3 PID: 22353
I am a child2: 4 PID: 22354
I am a child2: 5 PID: 22355
I am a child2: 3 PID: 22351
I am a child2: 4 PID: 22356
I am a child2: 5 PID: 22357
I am a child2: 4 PID: 22348
I am a child2: 5 PID: 22358

最佳答案

[ozdeny@hyperion ~]$ I am a child2: 3 PID: 22336

如果这是你的问题,这意味着你的根进程比它的子进程更早退出。使用 waitpid()[1] 让根等待它的子进程。

[1] http://linux.die.net/man/2/waitpid

LE:您将 waitpid 放在根进程而不是 fork 进程中。

LLE: 好吧,我终于明白了你想做什么,一个想法来自 jweyrich 的观察,它是这样返回它的子进程的 pids 数组,然后从根进程终止它们.

主体应该是这样的:

int* child_pids
//mem allocation
forkChildren();
for each pid in child_pids
kill(pid,*signal termination*)
forkChildren2()

关于通过 fork() 在 C 中创建多个进程和模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2742871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com