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一直等待输入一个字符,这是为了更好的明白程序的执行流程。


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐