смотрел старый тред насчет сабжа.там посоветовали сделать так:
1. процесс делает fork и ждет завершения
2. ребенок делает fork и завершается
3. внук делает execвот как я это реализовал. почему-то процессы сваливаются в зомби, хотя автор утверждал что этого не будет. где я туплю?
ps -ax | grep Z
0 v1 ZW+ 0:00,00 (ls)
if ((rc = fork()) == -1) {
perror("-ash-: fork");
printf("-ash-# ");
}
if (rc) {
wait(&stat_loc);
printf("-ash-# ");
}
else {
if (amper_count > 0) {
if ((rc = fork()) == -1) {
perror("-ash-: fork");
printf("#");
}
// if (rc) {
// wait(&stat_loc);
// }
else if (rc ==0) {
execvp(arg[0],arg);
perror("-ash-: exec");
return 0;
}
}
else {
execvp(arg[0],arg);
perror("-ash-: exec");
return 0;
}
В ТОТ МОМЕНТ, КОГДА ВОПРОС ДЛЯ ПРОГРАММИСТОВ ВЫВАЛИВАЕШЬ НА ОБЩИЙ ФОРУМ
тебе надо
http://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi?az=li...
Ж-)))
>смотрел старый тред насчет сабжа.
>
>там посоветовали сделать так:
>1. процесс делает fork и ждет завершения
>2. ребенок делает fork и завершается
>3. внук делает exec
>
>вот как я это реализовал. почему-то процессы сваливаются в зомби, хотя автор
>утверждал что этого не будет. где я туплю?
>
>ps -ax | grep Z
>
>0 v1 ZW+ 0:00,00 (ls)
>
>
> if ((rc = fork()) == -1) {
>
> perror("-ash-: fork");
>
> printf("-ash-# ");
> }
>
>
> if
>(rc) {
>
> wait(&stat_loc);
>
> printf("-ash-# ");
> }
>
>
> else
>{
>
> if (amper_count > 0) {
>
> if ((rc = fork()) == -1) {
>
> perror("-ash-: fork");
> printf("#");
> }
>
> // if (rc) {
> // wait(&stat_loc);
> // }
>
> else if (rc ==0) {
>
> execvp(arg[0],arg);
> perror("-ash-: exec");
> return 0;
> }
> }
>
> else {
> execvp(arg[0],arg);
> perror("-ash-: exec");
>
> return 0;
>
> }
>
Процесс превращается в зомби, когда родитель не завершился, а ребенок завершился, причем родитель не дождался его завершения. Если родитель завершается, а ребенок - нет, то его (ребенка) подбирает init и никакого зомби не возникает. Видимо, в твоей ситуации внука init не подбирает, потому что есть дед, внук завершается, но никто его wait'ом не ждет - вот и возникает зомби.Удачи.
>смотрел старый тред насчет сабжа.
>
>там посоветовали сделать так:
>1. процесс делает fork и ждет завершения
>2. ребенок делает fork и завершается
>3. внук делает exec
>
>вот как я это реализовал. почему-то процессы сваливаются в зомби, хотя автор
>утверждал что этого не будет. где я туплю?
>
>ps -ax | grep Z
>
>0 v1 ZW+ 0:00,00 (ls)
>
>
> if ((rc = fork()) == -1) {
>
> perror("-ash-: fork");
>
> printf("-ash-# ");
> }
>
>
> if
>(rc) {
>
> wait(&stat_loc);
>
> printf("-ash-# ");
> }
>
>
> else
>{
>
> if (amper_count > 0) {
>
> if ((rc = fork()) == -1) {
>
> perror("-ash-: fork");
> printf("#");
> }
>
> // if (rc) {
> // wait(&stat_loc);
> // }
>
> else if (rc ==0) {
>
> execvp(arg[0],arg);
> perror("-ash-: exec");
> return 0;
> }
> }
>
> else {
> execvp(arg[0],arg);
> perror("-ash-: exec");
>
> return 0;
>
> }
>
Процесс превращается в зомби, когда родитель не завершился, а ребенок завершился, причем родитель не дождался его завершения. Если родитель завершается, а ребенок - нет, то его (ребенка) подбирает init и никакого зомби не возникает. Видимо, в твоей ситуации внука init не подбирает, потому что есть дед, внук завершается, но никто его wait'ом не ждет - вот и возникает зомби.Удачи.