>смотрел старый тред насчет сабжа.
>
>там посоветовали сделать так:
>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'ом не ждет - вот и возникает зомби.
Удачи.
|