嵌入式Linux并发程序设计,进程间通信方式,信号,信号相关函数,信号发送kill()/raise(),创建定时器alarm(),让进程进入等待态pause(),设置信号响应方式signal()

1,信号发送kill()/raise()

#include <unistd.h>
#include <signal.h>
int kill(pid_t pid, int sig);
int raise(int sig); //自己给自己发信号

  1. 成功时返回0,失败时返回EOF
  2. pid 接收进程的进程号;0代表同组进程; -1代表所有进程(除系统INIT进程和当前进程外的所有进程)
  3. sig 信号类型(通过宏指定)

可以通过getpid()获取当前进程的进程号,然后给当前进程发信号(也可以给父进程发信号)

2,创建一个定时器(,创建一个闹钟) alarm()

int alarm(unsigned int seconds);

  1. 成功时返回上个定时器的剩余时间,失败时返回EOF
  2. seconds 定时器的时间,如果seconds指定为0,意思是取消当前定时器
  3. 一个进程中只能设定一个定时器,时间到时产生SIGALRM

3,让进程进入等待态,进入睡眠pause()

int pause(void);

  1. 进程一直阻塞,直到被信号中断
  2. 被信号中断后返回-1,errno为EINTR

4,示例 alarm()、pause()

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

int main(int argc, const char *argv[])
{
	alarm(3);
	pause();//程序很短,执行很快,定时时间还没到,程序就已经结束了,所以要加pause()函数来产生等待
	
	printf("I have been waken up!\n");

	return 0;
}
linux@linux:~/test/interprocess$ gcc alarm_pause.c -o alarm_pause.out
linux@linux:~/test/interprocess$ ./alarm_pause.out 
Alarm clock
  1. 重要:alarm经常用于实现超时检测
  2. alarm()产生的SIGALRM信号默认操作是终止信号,所以pause()后面的程序实际上是没有执行的
  3. 定时器信号缺省的默认处理方式会打印Alarm clock

5,设置信号响应方式*signal()

进程对信号有不同的响应方式
缺省方式
忽略信号
捕捉信号

#include <unistd.h>
#include <signal.h>
void (*signal(int signo, void (*handler)(int)))(int);

  1. 成功时返回原先的信号处理函数,失败时返回SIG_ERR
  2. signo 要设置的信号类型(除SIGKILL、SIGSTOP外,这两个信号级别很高)
  3. handler 指定的信号处理函数: SIG_DFL代表缺省方式; SIG_IGN 代表忽略信号;捕捉信号,固定的函数接口handler()
  4. signal函数的作用是把一个信号和信号处理函数关联起来,本身并不会发送信号

6,示例signal()

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


void handler (int signo) 
{
	if (signo == SIGINT) 
	{
		printf("I have got SIGINT!\n"); 
	}
	if (signo == SIGQUIT) 
	{
		printf("I have got SIGQUIT\n"); 
	}
}

int  main() 
{
	signal(SIGINT, handler);
	signal(SIGQUIT, handler);
	while ( 1 ) pause();
	return 0;
} 
linux@linux:~/test/interprocess$ ./signal.out 

^CI have got SIGINT!
^\I have got SIGQUIT
^Z
[1]+  Stopped                 ./signal.out
linux@linux:~/test/interprocess$ jobs 
[1]+  Stopped                 ./signal.out
linux@linux:~/test/interprocess$ fg 1
./signal.out
^CI have_ras3e got SIGINT!

^\I have got SIGQUIT

猜你喜欢

转载自blog.csdn.net/m0_37542524/article/details/83997239