Разворот и запуск dhclient (с параметрами -nw -w) в exec создает несуществующий процесс и процесс-демон - PullRequest
0 голосов
/ 12 декабря 2018

Я вижу процесс зомби и процесс 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);

Может кто-нибудь указать мне, что я делаюнеправильно.

Syed

1 Ответ

0 голосов
/ 12 декабря 2018

Процесс зомби 31298 существует до тех пор, пока родительский процесс еще не ждал его, поэтому, возможно, что-то не так с вашей таблицей процессов или вашим вызовом waitpid.Я не могу проверить, потому что ваш код неполон.

Вместо ожидания конкретного PID, вы также можете подождать любого дочернего элемента или группы процессов и выяснить из полученной структуры siginfo_t, какой процесс только что сообщил о своем состоянии.изменить.

Я не знаю, какую строку вы назначаете с помощью

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

argv[0] должно быть именем файла программы, то есть таким же, как WAN_EXECUTABLE

...