pause简介:
Linux提供了系统调用pause函数,来暂停当前进程,当前进程进入睡眠状态。直到接收到信号且信号函数成功返回,pause函数才会返回,而且返回值为-1。
pause函数声明:
#include<unistd.h>
int pause(void);
说明:
暂停当前进程,当前进程进入睡眠状态(即挂起)。直到接收到信号且信号函数成功返回,pause函数才会返回,而且返回值为-1。
返回值:
始终返回-1。
SIGINT信号的处理:
再进行pause程序演示之前,先看一个简单的信号处理:SIGINT信号的处理。
SIGINT信号:程序中止信号,在用户键入INTR字符(通常是Ctrl+C)时发出。
例程:
#include <stdio.h>
#include <signal.h>
/*SIGINT信号处理函数*/
void sigint_handler() {
printf("sigint happend!\n");
}
int main()
{
sigset( SIGINT, sigint_handler );
printf( "main...\n");
while(1);
return 0;
}
编译运行:
% gcc sigint_test.c -o sigint
% ./sigint
main... //在这里,一致是while(1),直到用户输入Ctrl+C终止程序。
当用户输入Ctrl+C,SIGINT信号被发送,它的处理函数是sigint_handler,所以,会执行sigint_handler函数,运行结果如下:
main...
^Csigint happend!
^Csigint happend!
^Csigint happend!
^Csigint happend!
^Csigint happend!
^Csigint happend!
一直按Ctrl+C,sigint_handler就一直执行。
pause函数使用举例:
功能:暂停进程的执行,直到按下Ctrl+C,强行终止,但是执行的是我们自己注册的处理函数,而不是直接退出程序。
代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
/*信号处理函数*/
void sigint_handler(int signum) {
printf("signum = %d\n", signum);
/*等待输入一个字符*/
getchar();
printf("sigint_handler return\n");
}
int main() {
/*注册信号处理函数 */
if(SIG_ERR == signal(SIGINT, sigint_handler)) {
perror("error!\n");
return -1;
}
printf("pause begin...\n");
pause();
printf("pause end.\n");
return 0;
}
编译和运行:
% gcc pause_test.c -o pause_test
% ./pause_test
pause begin...
a
^Csignum = 2。//一直到Ctrl+C被按下,触发SIGINT信号,
sigint_handler return
pause end. //信号处理完,pause才返回
%
说明:
1)signal(SIGINT, sigint_handler)是信号注册函数。其中,SIGINT是程序终止信号,sigint_handler是信号处理函数。
2)pause():当SIGINT信号发生时,sigint_handler会被执行;执行完毕后,意味着pause也执行完毕,然后,返回到pause的下一条语句继续执行;
3)在sigint_handler函数中,getchar一直等待输入一个字符,这是为了更好的明白程序的执行流程。
本文介绍了Linux系统调用pause函数的功能及使用方法,并通过实例演示了如何利用pause配合信号处理函数实现进程暂停。pause函数使进程进入睡眠状态直至接收到特定信号。
645

被折叠的 条评论
为什么被折叠?



