C: интерпретатор shell

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: C: интерпретатор shell

Непрочитанное сообщение Olej » 22 дек 2016, 14:01

Olej писал(а): После завершения на некоторое время образуется зомби:

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

[olej@dell 6]$ ps -A | grep bgr
  499 pts/6    00:00:00 bgr <defunct>
Но если вы а). категорически не хотите использовать systemd и б). хотите не иметь зомби в классическом его понимании, то поменяем код (показан только изменяемый "хвост"):

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

      int nwait = 0; 
...
               if( !pipeline[ i ].bground ) {
                  execvp( pipeline[ i ].arglist[ 0 ], pipeline[ i ].arglist );
                  perror( "execvp failed" );
                  exit( 1 );
               }
               else {
                  pid_t pid = fork();      // транзитный процесс
                  if( 0 == pid ) {
                     close( 0 ); close( 1 ); close( 2 );
                     int fd0 = open( "/dev/null", O_RDWR ),
                         fd1 = dup( 0 ),
                         fd2 = dup( 0 );
                     if( fd0 != 0 || fd1 != 1 || fd2 != 2 )
                        printf( "demonize error!\n" );
                     execvp( pipeline[ i ].arglist[ 0 ], pipeline[ i ].arglist );
                  }
                                           // запускающий процесс
                  printf( "[%u]\n", pid );
                  exit( 0 );
               }
            }
            if( !pipeline[ i ].bground )   // родительский shell 
               nwait++;
            else
               usleep( 1000 );              // дать завершить background
            if( i > 0 ) {
               close( fd[ i - 1 ][ 0 ] );
               close( fd[ i - 1 ][ 1 ] );
            }
         }  // for по конвейеру  
      } // block {...}
...
Здесь background процесс (&) запускается не дочерним процессом, а внуком ... а сам дочерний процесс (после запуска внука) завершается.
При этом background процесс от самого момента запуска теряет родителя, прикрепляется к init-процессу (это может быть и systemd), и после отработки благополучно завершается и удаляется:

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

[olej@dell 6]$ ./+shell_e
> ./bgr &
[10210]
> ps | grep bgr
10210 pts/1    00:00:00 bgr
> ps | grep bgr
10210 pts/1    00:00:00 bgr
> ps | grep bgr
10210 pts/1    00:00:00 bgr
> ps | grep bgr
> exit
Всё работает ;-) :

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

[olej@dell 6]$ ./+shell_e
> ls -l | wc -l | cat | cat | cat
29
> ls -l | wc -l | cat | cat | cat >c1
> cat <c1
29
> exit
Но это именно то, от чего отговаривает Ленарт Поттеринг, автор systemd, при написании программ-демонов!
Вложения
+shell_e.c
(7.95 КБ) 110 скачиваний

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя