分享
 
 
 

Jicama下的signal编程

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

signal是UNIX下最常用的一种通信机制,程序对不同的信号安装处理处理函数,JICAMA支持32个信号,目前还没有平台专用的信号,基本上可以与传统的UNIX兼容。

这是最简单的一个SIGNAL的编程例子,原先的程序来自MINIX:

/* sleep - suspend a process for x sec Author: Andy Tanenbaum */

#include <stdio.h>

#include <unistd.h>

#include <signal.h>

void sigalrm(int signo)

{

int *ret;

*ret=(int *)&ret+2;

printf("receive alarm, signo=%d, ret 0x%x\n", signo,*ret);

}

int main(argc, argv)

int argc;

char *argv[];

{

register seconds;

register char c;

seconds = 0;

if (argc != 2) {

printf("Usage: sleep time\n");

exit(1);

}

while (c = *(argv[1])++) {

if (c < '0' || c > '9') {

printf("sleep: bad arg\n");

exit(1);

}

seconds = 10 * seconds + (c - '0');

}

/* Now sleep. */

signal(SIGALRM, sigalrm);

alarm(seconds);

pause();

return(0);

}

这个程序的目的是让程序睡眠seconds秒,然后唤醒,继续运行。在用户接口上,JICAMA和MINIX完全一致,这是为了保障程序的兼容性,下面分析下其中的实现吧,

signal函数原代码:

__sighandler_t signal(int sig, __sighandler_t func)

{

__sighandler_t res;

__asm__("int $0x80":"=a" (res):

"0" (NR_SIGNAL),"b" (sig),"c" ((long)func),"d" ((long)&asm_sig_restore));

return res;

}

__sighandler_t是一个函数指针,原形被定义如下:

typedef void (*__sighandler_t) (int);

signal的目的是为了注册一个信号处理,返回先前该信号的处理句柄,他只有2个参数,sig是要注册的信号,func是当信号发生的情况下执行的函数。

然后alarm设置一个闹钟,注意如果没有signal(SIGALRM, sigalrm);这行代码的话闹钟将会是程序自动退出。pause()将目前的进程挂起,并调度,其他进程运行。

seconds之后,程序得到恢复,进程被标上SIGALRM信号,这时候查找相应的执行函数,如果SIGALRM已经被注册了,则执行注册的程序,在程序开始执行的时候,堆栈构造如下:

esp=_asm_sig_restore

esp+4=信号(signo)

esp+8=保留(???)

esp+12=mask(sigmask)

esp+16=原先的寄存器内容(regs)

他的参数是保存在esp+4,自然是signo,函数执行过后还需要继续往后面的程序运行这个就是恢复函数,否则极有可能抛出一个异常,终止程序运行,恢复内定是由asm_sig_restore来完成的,这是一段汇编代码,它是用NASM写的:

_asm_sig_restore:

add esp,8

mov ebx, [esp+4]

mov ecx, [esp]

mov eax, 75

int 0x80

ret

首先把signo和???里面的内容丢弃,这时候esp的内容指向mask,把mask的内容保存在ecx,把原先寄存器的内容保存在ebx,用于过后的恢复,然后进入内核,内核把其中的寄存器恢复,这样可以继续往后面运行,呵呵,顺便说一句,黑客们完全可以利用_asm_sig_restore的原理来制造病毒程序。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有