Linux系统编程-进程暂停函数pause的使用,以及程序中止信号SIGINT的处理,signal信号注册

本文介绍了Linux系统调用pause函数的功能及使用方法,并通过实例演示了如何利用pause配合信号处理函数实现进程暂停。pause函数使进程进入睡眠状态直至接收到特定信号。

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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值