在exec中派生并运行dhclient(带有params -nw -w)会创建一个已终止的进程和一个守护进程

时间:2018-12-12 12:42:33

标签: c signals fork exec

当我从父进程派生然后使用其参数执行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进程名称仅仅是argurmnts,我不确定为什么,有人吗?

我的代码

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,并且将等待该过程。我有多个进程正在运行

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);

有人可以指出我做错了什么吗?

赛义德

1 个答案:

答案 0 :(得分:0)

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

除了等待特定的PID,您还可以等待任何子进程或进程组,并从产生的siginfo_t结构中找出哪个进程刚刚报告了其状态变化。

我不知道您分配给哪个字符串

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

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

相同。