Как работает pause()?

Я полностью нуб в c. Мне нужно написать функцию mypause(), которая должна иметь функциональность, похожую на системный вызов pause(), и протестировать функцию mypause() в программе, которая многократно блокирует ожидание сигнала. Как работает функция te pause()? Не могу ли я сделать mypause() следующим образом:

fprintf( stderr, "press any key to continue\n" );

чтобы программа блокировала и дождалась сигнала?

Имейте в виду, что я никогда не могу использовать pause() или sigpause().

Ответы

Ответ 1

Функциональные блоки pause() до тех пор, пока не поступит сигнал. Входы пользователя не являются сигналами. Сигнал может излучаться другим процессом или самой системой.

Нажатие Ctrl-C, например, заставляет вашу оболочку посылать сигнал SIGINT текущему запущенному процессу, который в обычных случаях заставляет процесс быть убитым.

Чтобы эмулировать поведение pause в ISO C99, вы можете написать что-то вроде следующего. Код комментируется, если у вас есть вопрос об этой реализации, пожалуйста, спросите.

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

/**
 * The type sig_atomic_t is used in C99 to guarantee
 * that a variable can be accessed/modified in an atomic way
 * in the case an interruption (reception of a signal for example) happens.
 */
static volatile sig_atomic_t done_waiting = 0;

static void     handler()
{
  printf("Signal caught\n");
  done_waiting = 1;
}

void    my_pause()
{
  /**
   *  In ISO C, the signal system call is used
   *  to call a specific handler when a specified
   *  signal is received by the current process.
   *  In POSIX.1, it is encouraged to use the sigaction APIs.
   **/
  signal(SIGINT, handler);
  done_waiting = 0;
  while ( !done_waiting )
    ;
}

int     main()
{
  my_pause();
  printf("Hey ! The first call to my_pause returned !\n");
  my_pause();
  printf("The second call to my_pause returned !\n");
  return (0);
}

Примечание. Этот пример работает только с сигналом SIGINT. Чтобы обрабатывать дополнительный набор сигналов, вы можете использовать другие вызовы signal() с разными номерами сигналов или использовать sigaction() с помощью маски, ссылающейся на все нужные сигналы.

Полный список доступных сигналов в вашей системе содержится в <signal.h> include.