linux信号

1.管道:
    进程间通信最简单的形式

2.信号:
    内核层和用户层通信的一种方式

    1.信号类型:
    1) SIGHUP  2) SIGINT  3) SIGQUIT  4) SIGILL  5) SIGTRAP
    6) SIGABRT  7) SIGBUS  8) SIGFPE  9) SIGKILL 10) SIGUSR1
    11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
    16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
    21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
    26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
    31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
    38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
    43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
    48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
    53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
    58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
    63) SIGRTMAX-1 64) SIGRTMAX

    可以从终端输入:
        SIGINT      ctrl+c 
        SIGQUIT     ctrl+\
        SIGTSTP     ctrl+z 
    
    9号和19号信号 
        SIGKILL 进程结束
        SIGSTOP 进程挂起

    SIGSEGV:表示内核操作内存错误
    SIGUSR1:用户可以使用该信号实现通信 
    SIGCHLD:表示该进程有一个子进程结束了 
    SIGPIPE:表示管道破裂
    SIGIO:表示IO事件发生

    2.信号的处理方式:
        1.缺省:
            按照默认的方式处理信号
        2.忽略:
            不处理信号
        3.捕捉:
            按照指定的方式处理信号

        9号SIGKILL和19号信号SIGSTOP不能被忽略和捕捉
    
    3.函数接口:
        1.signal
            typedef void (*sighandler_t)(int);
            sighandler_t signal(int signum, sighandler_t handler);
            功能:
                切换信号的处理方式
            参数:
                signum:信号的编号
                handler:信号对应的处理方式
                    SIG_IGN     忽略信号
                    SIG_DFL     缺省信号处理方式
                    自定义的函数的函数名(指向函数的指针)
            返回值:    
                成功返回之前注册的信号的处理方式
                失败返回SIG_ERR

    4.定时器:
        alarm 
        unsigned int alarm(unsigned int seconds);
        功能:
            间隔seconds秒后给进程发送SIGALRM信号
        参数:
            seconds:间隔秒数
        返回值:
            成功返回上次定时剩余的秒数
            失败返回-1

    5.kill 
        int kill(pid_t pid, int sig);
        功能:
            向进程发送信号
        参数:
            pid:进程id
            sig:信号值
        返回值:
            成功返回0
            失败返回-1
 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

 

#include "../head.h"

void handler(int signo)

{

printf("电话来了,休息一下!\n");

return;

}

void handler2(int signo)

{

printf("外卖来了, 快开门\n");

return;

}

int main(void)

{

void (*pret)(int) = NULL;

pret = signal(SIGINT, handler2);

if (SIG_ERR == pret)

{

perror("fail to signal");

return -1;

}

printf("SIGINT信号处理方式切换为:捕捉\n");

pret = signal(SIGQUIT, handler);

if (SIG_ERR == pret)

{

perror("fail to signal");

return -1;

}

printf("SIGQUIT信号处理方式切换为:捕捉\n");

while (1)

{

printf("正在工作!\n");

sleep(1);

}

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

 

#include "../head.h"

void handler(int signo)

{

if (SIGINT == signo)

{

printf("外卖来了,快开门!\n");

}

else if (SIGQUIT == signo)

{

printf("电话来了,休息一下!\n");

}

return;

}

int main(void)

{

signal(SIGINT, handler);

signal(SIGQUIT, handler);

while (1)

{

printf("正在工作\n");

sleep(1);

}

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

 

#include "../head.h"

void ontimer_handler(int signo)

{

printf("刷新一次界面!\n");

alarm(5);

return;

}

int main(void)

{

signal(SIGALRM, ontimer_handler);

alarm(5);

while (1)

{

printf("正在工作!\n");

sleep(1);

}

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

 

#include "../head.h"

#include "timer.h"

void ontimer_handler(void)

{

printf("时间到了, 界面该刷新!\n");

return;

}

int main(void)

{

mtimer_t mtimer;

char ch = 0;

SetTimerInterval(&mtimer, 2, ontimer_handler);

StartTimer(&mtimer);

while (1)

{

ch = getchar();

if ('d' == ch)

{

StopTimer(&mtimer);

}

else if ('a' == ch)

{

StartTimer(&mtimer);

}

else if ('q' == ch)

{

break;

}

}

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

 

#include "../head.h"

pid_t pid;

void handler_child(int signo)

{

if (SIGUSR1 == signo)

{

printf("好的,快去做饭!\n");

}

else if (SIGQUIT == signo)

{

printf("爸,我回来了!\n");

kill(getppid(), SIGUSR2);

}

return;

}

void handler_parent(int signo)

{

if (SIGINT == signo)

{

printf("儿子,我回来了!\n");

kill(pid, SIGUSR1);

}

else if (SIGUSR2 == signo)

{

printf("今天肯定进步了吧!\n");

}

return;

}

int main(void)

{

pid = fork();

if (-1 == pid)

{

perror("fail to fork");

return -1;

}

if (0 == pid)

{

signal(SIGUSR1, handler_child);

signal(SIGINT, SIG_IGN);

signal(SIGQUIT, handler_child);

}

else if (pid > 0)

{

signal(SIGINT, handler_parent);

signal(SIGQUIT, SIG_IGN);

signal(SIGUSR2, handler_parent);

}

while (1)

{

}

return 0;

}

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值