URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 36144
[ Назад ]

Исходное сообщение
"процесс в фоновый режим"

Отправлено aagr , 19-Окт-03 12:04 
смотрел старый тред насчет сабжа.

там посоветовали сделать так:
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;
             }
            


Содержание

Сообщения в этом обсуждении
">утверждал что этого не будет. где я туплю? "
Отправлено Lamr , 19-Окт-03 20:11 
В ТОТ МОМЕНТ, КОГДА ВОПРОС ДЛЯ ПРОГРАММИСТОВ ВЫВАЛИВАЕШЬ НА ОБЩИЙ ФОРУМ
тебе надо
http://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi?az=li...
Ж-)))

"процесс в фоновый режим"
Отправлено Дмитрий , 20-Окт-03 12:34 
>смотрел старый тред насчет сабжа.
>
>там посоветовали сделать так:
>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'ом не ждет - вот и возникает зомби.

Удачи.



"процесс в фоновый режим"
Отправлено Дмитрий , 20-Окт-03 12:36 
>смотрел старый тред насчет сабжа.
>
>там посоветовали сделать так:
>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'ом не ждет - вот и возникает зомби.

Удачи.