signal.h(c标准库)

看代码,代码和操作系统关系还是很大,未测试

 1 /*my_signal.h*/
 2 /*
 3  * 信号是程序执行过程中发生的异常事件。
 4  * 同步信号的产生是因为程序自身的某些动作,例如除零或不正当地访问存储器。
 5  * 异步信号是由程序外部的行为引起的。如敲击提示键,或另一个程序给你的程序发的信号,都会引发一个异步信号。
 6  * 
 7  * 程序不能屏蔽的信号要求立即得到处理。不处理,终止且向标准错误流输出一条错误信息。
 8  *
 9  * signal.h定义了一个无穷信号集的各种编码值。声明2个函数。
10  * raise,报告一个同步信号。
11  * signal,指定一种信号的处理方法。默认处理终止程序;信号忽略是直接将信号丢弃;信号处理是把控制权转移给一个指定的函数。
12  * 在3情况下,c在遇到一个报告的信号时,就会调用相应的信号处理程序,程序的正常执行就会被挂起。如果信号处理程序把控制权返回给调用者,
13  * 程序就会从它被挂起的那个点继续执行。一个可移植的程序几乎不能安全地使用信号处理程序。
14  *
15  * 一个信号处理程序内访问的所有数据对象声明为volatile类型。
16  * sig_atomic_t类型,它是一个程序以原子方式访问的整数类型。一个信号在程序访问这种类型的数据对象的过程中,决不会挂起程序。
17  *
18  * 信号可能丢失,信号处理程序处理一个信号之前,又有一个信号发生,那么就会有个信号被忽略。
19  * 可移植性不高或者说不可移植。unix系统一般调用系统服务signal完成所有工作。
20  */
21 #ifndef MY_SIGNAL_H_
22 #define MY_SIGNAL_H_
23 #ifndef _YVALS_H_
24 #include "yvals.h"
25 #endif
26 
27 typedef int sig_atomic_t;
28 typedef void _sigfun(int);
29 
30 #define MY_SIGABRT _SIGABRT
31 #define MY_SIGINT   2
32 #define MY_SIGILL   4
33 #define MY_SIGFPE   8
34 #define MY_SIGSEGV  11
35 #define MY_SIGTERM   15
36 #define _NSIG   _SIGMAX 
37 
38 #define MY_SIG_DFL  (_sigfun *)0
39 #define MY_SIG_ERR  (_sigfun *)-1
40 #define MY_SIG_IGN  (_sigfun *)1
41 
42 int raise(int);
43 _sigfun *signal(int, _sigfun *);

 

 1 /*my_signal.c*/
 2 #include "my_signal.h"
 3 
 4 extern _sigfun *_sigtable[_NSIG];
 5 
 6 _sigfun *(signal)(int sig, _sigfun *fun)
 7 {
 8     _sigfun *s;
 9 
10     if(sig <= 0 || _NSIG <= sig || fun == MY_SIG_ERR)
11         return (SIG_ERR);
12     s = _sigtable[sig], _sigtable[sig] = fun;
13     return s;
14 }

 

 1 /*my_raise.c*/
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include "my_signal.h"
 5 
 6 _sigfun *_sigtable[_NSIG] = {0};
 7 
 8 int (raise)(int sig)
 9 {
10     _sigfun *s;
11 
12     if(sig <= 0 || _NSIG <= sig)
13         return -1;
14     if((s = _sigtable[sig]) != MY_SIG_IGN && s != MY_SIG_DFL){
15         _sigtable[sig] = MY_SIG_DFL;
16         (*s)(sig);
17     }else if(s == MY_SIG_DFL){
18         char ac[10], *p;
19 
20         switch (sig){
21             case MY_SIGABRT:
22                 p = "abort";
23                 break;
24             case MY_SIGFPE:
25                 p = "arithmetic error";
26                 break;
27             case MY_SIGILL;
28                 p = "invalid executable code";
29                 break;
30             case MY_SIGINT:
31                 p = "interruption";
32                 break;
33             case MY_SIGSEGV:
34                 p = "invalid storage access";
35                 break;
36             case MY_SIGTERM:
37                 p = "termination request";
38             default:
39                 *(p = &ac[(sizeof ac) -1]) = '\0';
40                 do *--p = sig % 10 + '0';
41                     while((sig/=10) != 0);
42                 fputs("signal #", stderr);                
43         }
44         fputs(p, stderr);
45         fputs(" -- terminating\n", stderr);
46         exit(EXIT_FAILURE); 
47     }
48     return 0;
49 }

 

转载于:https://www.cnblogs.com/kevin-kang/p/3170441.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`thread.h` 是 POSIX 线程库的头文件,提供了一套标准的线程 API,包括线程创建、销毁、同步等操作。在 Linux、Unix 等系统中,通常使用 `pthread` 库来实现 `thread.h` 中定义的接口。 在 Linux 系统中,`pthread` 库实现了 `thread.h` 中定义的接口,提供了一套可移植的线程 API。`pthread` 库通常由 C 标准库操作系统内核提供,可以通过链接标准库或者操作系统内核来使用。在使用 `pthread` 库时,需要包含 `pthread.h` 头文件,并使用 `-lpthread` 选项链接库。 `pthread` 库实现了线程的创建、销毁、同步等操作,具体实现方式包括: 1. 线程创建 使用 `pthread_create` 函数创建新的线程。该函数接受一个函数指针作为参数,用于指定新线程的入口函数,同时可以指定一些参数传递给入口函数。 2. 线程销毁 使用 `pthread_cancel` 函数可以请求终止指定的线程。被终止的线程会立即退出,并释放占用的资源。 3. 线程同步 使用 `pthread_mutex_lock` 和 `pthread_mutex_unlock` 函数可以对共享资源进行加锁和解锁操作,从而避免竞态条件。使用 `pthread_cond_wait` 和 `pthread_cond_signal` 函数可以进行条件变量操作,实现线程间的同步和通信。 4. 线程属性 使用 `pthread_attr_init`、`pthread_attr_setdetachstate`、`pthread_attr_setstacksize` 等函数可以设置新线程的属性,例如线程的分离状态、栈大小等。 在实现 `pthread` 库时,需要考虑线程的调度、同步、内存管理等问题。具体实现方式可能因操作系统和硬件平台而异。在 Linux 系统中,`pthread` 库通常使用系统调用和 CPU 指令等底层机制来实现线程操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值