Как выйти (прервать) функцию waitpid ()? - PullRequest
0 голосов
/ 19 мая 2018

В настоящее время я программирую оболочку и использую функцию waitpid() для своих дочерних процессов.

Я также установил обработчик сигнала, чтобы я мог перехватить SIGINT ( CTRL + C ) сигнал.

Теперь я хочу, чтобы кто-то нажимал на сигнал SIGINT ( CTRL + C ), чтобы он покинул функции waitpid() и продолжал работать как обычно.

Я ищу функцию, которая поможет мне в этом.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Блокировка процесса на waitpid() вернется при получении сигнала и установит errno на EINTR.

Для того, чтобы этот обработчик сигнала не работалустанавливается с опцией SA_RESTART.

Для установки ручки сигнала без установки опции SA_RESTART предпочтительной функцией является sigaction().

void handle(int sig)
{
  /* Do nothing. */
}

int main(void)
{
  sigaction(SIGINT, (struct sigaction){handler}, NULL);

  /* fork and bla ... */

  if (-1 == waitpid(..., /*no WNOHANG here */))
  {
    if (EINTR == errno)
    {
      /* process received signal */
      ...
0 голосов
/ 19 мая 2018

Установите ваш обработчик сигнала без флаг SA_RESTART:

void handler( int sig, siginfo_t *si, void *arg )
{
    ...
}

...

struct sigaction newact;
memset( &newact, 0, sizeof( newact ) );
sigemptyset( &newact.sa_mask );
newact.sa_flags = SA_SIGINFO;  // note that **lack** of SA_RESTART
newact.sa_siginfo = handler;

sigaction( SIGINT, &newact, NULL );

Вы должны будете добавить проверку ошибок к этому, и обратите внимание, что теперь вам придется обрабатывать прерванныезвонки в вашем коде.

...