wait не работает. (wait не работает.)

Модератор: Модераторы разделов

rapa
Сообщения: 29
ОС: Linux Fedora 8

wait не работает.

Сообщение rapa »

Кто-нить может подсказать,почему wait не работает.
int DHCPBegin(void)
{
int ChildPid;
char Program[] = {"udhcpc"};
char *ArgList[] = {"udhcpc",NULL,NULL};
unsigned short StatusDHCP = 0;
#if DEBUG
printf("DHCPBegin\n");
#endif
fprintf(stdout,"\r\nDHCP server started\n");
ChildPid = fork();
if( ChildPid != 0) {gDHCPPid = ChildPid;wait(&StatusDHCP); return ChildPid;}
else
{
execvp(Program,ArgList);
exit(0);
}
return 0;
}
int main()
{
.......
.
.
.......
DHCPBegin();
/*2*/
return 0;
}


До того как DHCP сервак заканчивает давать IP=шку, выполняется код который обозначем /*2*/

Может я что не так делаю?Подскажите, плз.

Заранее спасибо.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: wait не работает.

Сообщение RasenHerz »

м-да, а зачем wait из дочернего процесса вызывать?

Код: Выделить всё

    ChildPid = fork();
    if(ChildPid > 0) { //Родительский процесс, ждем завершения потомка
        gDHCPPid = ChildPid;
        wait(&StatusDHCP);
        return ChildPid;
    }
    else if( ChildPid == 0){ //Дочерний процесс, замещаем его
        execvp(Program,ArgList);
        exit(0);
    }
    else{ //fork() не удался
        perror("fork");
        return -1;
    }


P.S. используйте теги code когда выкладываете здесь код, а то читать противно.
UPD. сорри, что-то я невнимательно вгляделся, wait вызывался из родительского процесса. подобный кусок кода у меня работает без проблем.
Спасибо сказали:
MiK13
Сообщения: 1281
ОС: Linux Debian

Re: wait не работает.

Сообщение MiK13 »

rapa писал(а):
31.03.2009 16:43
Кто-нить может подсказать,почему wait не работает.

Проверил эту программу у себя. Вот её модифицированный вариант. Модификации коснулись:
  • Добавил необходимые #include
    Заменил имя клиента μDHCP на имя текстового редактора (чтобы проверить, будет ли действительно ждать)
    Заменил тип переменной StatusDHCP на тот, что требует wait
    Добавил некоторую печать

Код:

#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> pid_t gDHCPPid; int DHCPBegin(void) { int ChildPid; char Program[] = {"gedit"}; char *ArgList[] = {"gedit",NULL,NULL}; ///unsigned short StatusDHCP = 0; -- При таком объявлении gcc ругается на wait int StatusDHCP; printf("DHCPBegin\n"); fprintf(stdout,"\r\nDHCP server started\n"); ChildPid = fork(); if( ChildPid != 0) { gDHCPPid = ChildPid; wait(&StatusDHCP); printf(" StatusDHCP = %d\n",StatusDHCP); return ChildPid; } else { execvp(Program,ArgList); perror("execvp"); exit(0); } return 0; } int main() { DHCPBegin(); puts("DHCPBegin done"); /*2*/ return 0; }

rapa писал(а):
31.03.2009 16:43
До того как DHCP сервак заканчивает давать IP=шку, выполняется код который обозначем /*2*/
А что за DHCP сервак и как эта прога должна узнать, что он выдал кому-то IP-шку?
При запуске моего варианта программы на экран выдаётся:

Код: Выделить всё

DHCPBegin

DHCP server started

После чего ещё выдаются предупреждения про GTK и вызывается редактор gedit.
После того, как я закрываю gedit в консоли появляется:

Код: Выделить всё

 StatusDHCP = 0
DHCPBegin done

Т.е. wait работает нормально
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: wait не работает.

Сообщение RasenHerz »

rapa писал(а):
31.03.2009 16:43
До того как DHCP сервак заканчивает давать IP=шку, выполняется код который обозначем /*2*/

возможно созданный вами потомок, погибает до того как ваш интерфейс получит IP-адрес. такое случается если вызванная вами программа udhcpc, проверив на правильность переданные ей аргументы, тоже создает потомка, который отправляет сигнал SIGKILL (или другой неперехватываемый) своему родителю. как результат вы получаете возврат из wait(), при этом IP-адрес может быть еще неполученным. вы уверены что udhcpc не становится демоном после старта?
Спасибо сказали:
MiK13
Сообщения: 1281
ОС: Linux Debian

Re: wait не работает.

Сообщение MiK13 »

RasenHerz писал(а):
01.04.2009 02:49
вы уверены что udhcpc не становится демоном после старта?

Хотя и не автор, но ради интереса поставил пакеры udhcpc и udhcpd.
Вот результат запуска:

Код: Выделить всё

# time udhcpc
udhcpc (v0.9.9-pre) started
Sending discover...
Sending select for 192.168.1.3...
Lease of 192.168.1.3 obtained, lease time 86400
Resetting default routes
adding dns 192.168.1.1

real    0m0.152s
user    0m0.016s
sys    0m0.032s
# pgrep -l dhcp
4495 udhcpc
Программа udhcpc выполнила свою задачу по получению IP адреса за 152 мс и осталась сидеть в памяти и не стала зомби. Т.е. она продолжает что-то делать (что -- пока не знаю).
Спасибо сказали: