linux捕获内核接收shell,[Linux Shell学习系列十三]捕获-1.信号

D25

本章学习如何实现:

1)健壮的脚本,在被强制终结时具有清除任何临时生成的日志或文件的能力。

2)当脚本收到一个来自用户的中断时,应该采取什么样的行动。

1. Linux中的信号

在Linux或其他类Unix操作系统中,信号被用于进程间的通信。信号是一个发送到某个进程或同一进程中的特定线程的异步通知,用于通知发生的一个事件。现在被定义在POSIX标准中。

当一个事件发生时,会产生一个信号,然后内核会将事件传递到接收的进程。

有时,进程可以发送一个信号到其他进程;

其他:如文件大小达到限额、一个I/O设备就绪或用户发送了Ctrl+C或Ctrl+Z的终端中断等。

运行在用户模式下的进程会接收信号。

如果接收的进程正运行在内核模式,那么信号的执行只有在该进程返回到用户模式时才会开始。

发送到非运行进程的信息一定是内核保存,直到进程重新执行为止。

休眠的进程可以是终端的,也可以是不可中断的。

如果可中断休眠状态的进程收到了一个信号,内核会唤醒这个进程来处理信息。

如果一个不可中断休眠状态的进程收到了一个信号,内核会拖延此信号,直到该事件完成为止。

当进程收到一个信号时,可能发生3种情况:

1)进程可能忽略此信号。有些没有默认行为的信号,默认会被忽略。而有些信号不能被忽略。

2)进程可能会捕获此信号,并执行一个被称为信号处理器的特殊函数。

3)进程可能会执行信号的默认行为,如信号15(SIGTERM)的默认行为是结束进程。

当一个进程执行信号处理时,如果还有其他信号到达,那么新的信号会被阻断知道处理器返回为止。

2. 信号的名称和值

每个信号都以SIG开头命名,并定义为唯一的正整数。使用kill -l可查看所有信号的名称和值。

$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) 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

信号值被定义在/usr/include/bits/signum.h中,其源文件是/user/src/linux/kernel/signal.c。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核提供了一个称为输入子系统(input subsystem)的框架来处理输入设备的数据。输入子系统将输入设备的数据转换为标准的输入事件,并将其传递给应用程序或其他系统组件。 输入子系统包含多个组件,其中最重要的是输入驱动程序(input driver)和输入事件接口(input event interface)。输入驱动程序负责从硬件设备读取输入数据,并将其转换为标准输入事件。输入事件接口提供了一种向用户空间传递输入事件的机制。 要实现输入捕获,可以编写一个输入驱动程序来读取输入设备的数据,并将其转换为标准输入事件。驱动程序可以使用内核提供的输入子系统接口来注册自己,并将输入事件传递给输入事件接口。应用程序可以使用输入事件接口来读取输入事件,并根据需要对其进行处理。 以下是一个简单的示例,演示如何编写一个输入驱动程序来捕获鼠标输入: 1. 定义一个输入设备结构体,该结构体包含输入设备的名称、ID和类型等信息。 ```c struct input_dev *dev; dev = input_allocate_device(); dev->name = "My Mouse"; dev->phys = "my_mouse/input0"; dev->id.bustype = BUS_USB; dev->id.vendor = 0x1234; dev->id.product = 0x5678; dev->id.version = 0x0100; dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); dev->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT); dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); ``` 2. 注册输入设备结构体,并指定输入事件处理函数。 ```c dev->open = my_mouse_open; dev->close = my_mouse_close; dev->event = my_mouse_event; input_register_device(dev); ``` 3. 在输入事件处理函数中读取鼠标输入数据,并将其转换为标准输入事件。 ```c void my_mouse_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) { switch(type) { case EV_REL: switch(code) { case REL_X: input_event(dev, EV_REL, REL_X, value); break; case REL_Y: input_event(dev, EV_REL, REL_Y, value); break; } break; case EV_KEY: input_event(dev, EV_KEY, code, value); break; } } ``` 4. 在应用程序中打开输入设备,并读取输入事件。 ```c fd = open("/dev/input/event0", O_RDONLY); while(1) { struct input_event ev; read(fd, &ev, sizeof(ev)); printf("type=%d, code=%d, value=%d\n", ev.type, ev.code, ev.value); } ``` 以上是一个简单的示例,实际的输入驱动程序可能需要更复杂的逻辑来处理不同的输入设备和输入事件类型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值