pause()如何工作?

时间:2013-04-13 20:30:02

标签: c

我在c中完全是菜鸟。我必须编写一个函数mypause(),它应具有与pause()系统调用类似的功能,并在重复阻止等待信号的程序中测试mypause()函数。 te pause()函数如何工作?我不能像这样做mypause()

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

为了让程序阻塞并等待信号?

请注意,我不能使用pause()sigpause()

1 个答案:

答案 0 :(得分:14)

pause()功能阻塞,直到信号到达。用户输入不是信号。信号可以由另一个进程或系统本身发出。

例如按Ctrl-C会导致您的shell向当前正在运行的进程发送SIGINT信号,在正常情况下会导致该进程被终止。

为了模拟ISO C99中pause的行为,您可以编写如下内容。代码被评论,如果您对此实现有疑问,请询问。

#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中找到系统中可用信号的完整列表。