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