Кто-нить может подсказать,почему 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*/
Может я что не так делаю?Подскажите, плз.
Заранее спасибо.
wait не работает. (wait не работает.)
Модератор: Модераторы разделов
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: wait не работает.
м-да, а зачем wait из дочернего процесса вызывать?
P.S. используйте теги code когда выкладываете здесь код, а то читать противно.
UPD. сорри, что-то я невнимательно вгляделся, 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 не работает.
Проверил эту программу у себя. Вот её модифицированный вариант. Модификации коснулись:
- Добавил необходимые #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;
}
А что за DHCP сервак и как эта прога должна узнать, что он выдал кому-то IP-шку?
При запуске моего варианта программы на экран выдаётся:
Код: Выделить всё
DHCPBegin
DHCP server startedПосле чего ещё выдаются предупреждения про GTK и вызывается редактор gedit.
После того, как я закрываю gedit в консоли появляется:
Код: Выделить всё
StatusDHCP = 0
DHCPBegin doneТ.е. wait работает нормально
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: wait не работает.
возможно созданный вами потомок, погибает до того как ваш интерфейс получит IP-адрес. такое случается если вызванная вами программа udhcpc, проверив на правильность переданные ей аргументы, тоже создает потомка, который отправляет сигнал SIGKILL (или другой неперехватываемый) своему родителю. как результат вы получаете возврат из wait(), при этом IP-адрес может быть еще неполученным. вы уверены что udhcpc не становится демоном после старта?
-
MiK13
- Сообщения: 1281
- ОС: Linux Debian
Re: wait не работает.
Хотя и не автор, но ради интереса поставил пакеры 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