gpt4 book ai didi

c - 在 exec 中 fork 并运行 dhclient(使用参数 -nw -w)会创建一个已失效的进程和一个守护进程

转载 作者:行者123 更新时间:2023-11-30 16:23:59 24 4
gpt4 key购买 nike

当我从父进程派生然后使用其参数执行 dhclient 进程时,我看到僵尸进程和 dhclient 进程

这是输出

root     31298  0.0  0.0      0     0 pts/2    Z    09:22   0:00 [dhclientForData] <defunct>
root 31410 0.0 0.0 24260 9108 ? Ss 09:23 0:00 -nw -w -sf etc/dhclient-script -pf /var/run/dhclient-vEth0.pid -lf /var/lib/dhcp/dhclient-vEth0.leases -cf /etc/sysconfig/dhclient.conf vEth0

我已在父进程中将 Linux 系统 dhclient 重命名为 dhclientForData。请注意上面输出中的第二行,我没有看到 dhclient 进程名称,只是看到参数,我不知道为什么,有人吗?

我的代码

func_parent()
{
pid_t child = 0;
child = fork();
if (child < 0)
{
return 0;
}
if (child == 0)
{
wanIntfDhclientHandlerProcessChildAdd ();
}
shmWlanTunMonitrConfig->childProcs[index].procId = child;
sleep(1);
}

uint8_t wanIntfDhclientHandlerProcessChildAdd ()
{
pid_t mypid = getpid();
uint8_t idx = gindex;
//for (; idx < MAX_WAN_PORTS; idx++)
{
if (!shmWlanTunMonitrConfig->childProcs[idx].isRunning && shmWlanTunMonitrConfig->childProcs[idx].cmdIdx != 0xFF)
{
shmWlanTunMonitrConfig->childProcs[idx].isRunning = 1;

char *const argV[] = {commands[idx].cmd[0],
commands[idx].cmd[1],
commands[idx].cmd[2],
commands[idx].cmd[3],
commands[idx].cmd[4],
commands[idx].cmd[5],
commands[idx].cmd[6],
commands[idx].cmd[7],
commands[idx].cmd[8],
commands[idx].cmd[9],
commands[idx].cmd[10],
NULL};
int ret = execvp(WAN_EXECUTABLE, argV);
}
}
}

我已注册到 sigchld 并将在该进程上 waitpid。我有多个进程正在运行

pid_t pid = waitpid(shmWlanTunMonitrConfig->childProcs[index].procId, &status, WNOHANG);

如果不再需要该作业,我只需从父进程中删除该进程。

char cmd[512] = {0};
sprintf(cmd, "for KILLPID in `ps ax | grep \'/var/run/dhclient\' | grep \'%s\' | awk \' { print $1;}\'`; do kill -9 $KILLPID; done", portIntfAr[index].intfName);
system (cmd);

任何人都可以指出我做错了什么吗?

赛义德

最佳答案

只要父进程尚未等待僵尸进程 31298 就存在,因此您的进程表或 waitpid 调用可能有问题。我无法检查,因为您的代码不完整。

您还可以等待任何子进程或进程组,并从生成的 siginfo_t 结构中找出哪个进程刚刚报告了其状态更改,而不是等待特定的 PID。

我不知道你分配的是哪个字符串

char *const argV[] = {commands[idx].cmd[0],
/* ... */

argv[0] 应该是程序的文件名,即与WAN_EXECUTABLE

相同

关于c - 在 exec 中 fork 并运行 dhclient(使用参数 -nw -w)会创建一个已失效的进程和一个守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53743277/

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