gpt4 book ai didi

c - 如何在子进程返回后从数组中删除它们?

转载 作者:行者123 更新时间:2023-11-30 16:45:31 25 4
gpt4 key购买 nike

因此,我有以下函数(名为 checkStatus()),它在每次循环时在 while 循环的开头运行。它打印出数组中当前使用的部分,其中存储了子进程 ID。此外,如果子进程已退出,它会打印出退出代码的状态。

只需执行类似以下操作即可添加数组:

//If background process child is made, add to the array and add to tracker
spawnpid = fork();
arrayBackgroundPids[sizeOfArrayTracker]=spawnpid;
sizeOfArrayTracker++;

函数代码在这里:

void checkStatus()
{
int backgroundStatus;
int i;
for(i=0;i<sizeOfArrayTracker;i++)
{
printf("ArrayPosition: %d\n", arrayBackgroundPids[i]);
fflush(stdout);
if(waitpid(arrayBackgroundPids[i], &backgroundStatus, WNOHANG))
{
if (WIFEXITED(backgroundStatus))
{
printf("background child exited with status of %d\n", WEXITSTATUS(backgroundStatus));
fflush(stdout);
}
}
}
}

此外,数组的声明如下:

int arrayBackgroundPids[500];

但是,我的程序在退出后不会删除 ID。最终,我希望数组做的就是存储事件子 ID。如果子 id 在循环运行时给出退出代码,我希望在打印退出信息后从数组中删除该 id。此外,子进程可以随时结束。因此 sleep 15 可能位于数组的位置 0,而 sleep 20 可能位于位置 1。因此,在这种情况下,位置 0 将在位置 1 之前退出。此外,反之亦然也可能发生。

最终,我只想要一个在从该数组添加和删除 id 时(打印退出代码后)动态扩展和收缩的数组。

有没有简单的方法可以做到这一点?

最佳答案

一种简单的方法是在进程退出后使数组中的 Pid“无效”。假设我们将值 0 解释为“不是有效的进程 ID”,那么代码可能如下所示:

        if(arrayBackgroundPids[i] && waitpid(arrayBackgroundPids[i], &backgroundStatus, WNOHANG))
{
if (WIFEXITED(backgroundStatus))
{
arrayBackgroundPids[i] = 0;
printf("background child exited with status of %d\n", WEXITSTATUS(backgroundStatus));
fflush(stdout);
}
}

当然,变量sizeOfArrayTracker并不直接反射(reflect)事件进程的数量。如果您需要这个数字,可以轻松地即时对其进行评估。

关于c - 如何在子进程返回后从数组中删除它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44089879/

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