OK6410A 开发板 (八) 61 linux-5.11 OK6410A 进程通信机制1 信号


信号
	异步通信机制
	不可靠/可靠

信号处理方式
	忽略	// SIGILL 和 SIGSTOP 不可忽略
	捕捉	// SIGILL 和 SIGSTOP 不可捕获
	默认
	
	// 信号处理对每一个信号有default(不是上面的默认)处理方式
	// 而用户可以修改
	// 也就是说如果一个信号如果默认为忽略,但是我可以将其改为 捕捉


常见信号默认用途
	ctrl-c 				SIGINT	终止
	除0 				SIGFPE 	终止
	无效内存引用			SIGSEGV 终止
	网络带外数据到来		SIGURG 	忽略
	写一个读终止的管道		SIGPIPE 终止
	进程定时器超时 		SIGALAM 终止


信号的发送
	对一个进程发送一个信号的本质是 把信号挂载到目标进程的信号 pending 队列上去
	
信号的接收 (不管信号处理方式如何,信号肯定会被接收)
	信号真正得到执行的时机是进程执行完异常,返回到用户态的时刻
	内核进程是不响应信号的(因为它不会返回到用户态),除非它刻意的去查询
代码分析参考
  • send
__send_signal() -> complete_signal() -> signal_wake_up() -> signal_wake_up_state()
signal_wake_up_state
	if (!wake_up_state(t, state | TASK_INTERRUPTIBLE)) kick_process(t);

  • 用户进程的receive
__irq_usr
	ret_to_user_from_irq
		slow_work_pending
			do_work_pending
				do_signal
	
do_signal
	如果是 system call 被信号中断,判断是否需要重启 system call
	get_signal() // (2) 从线程的信号 pending 队列中取出信号, // 
		dequeue_signal 从信号pending队列中,取出优先级最好的信号
		ka = &sighand->action[signr-1]; 从信号处理数组sighand中,取出信号对应的处理函数
		ka->sa.sa_handler == SIG_IGN : continue // 忽略
		ka->sa.sa_handler != SIG_DFL : break ; // break 返回之后 调用 handle_signal//捕获第一步
		其他 // 默认
			一部分 sig_kernel_ignore					// SIGCONT SIGCHLD SIGWINCH SIGURG
			一部分 sig_kernel_stop					// SIGSTOP SIGTSTP SIGTTIN SIGTTOU
			一部分 sig_kernel_coredump->do_coredump	// SIGQUIT SIGILL SIGTRAP SIGABRT SIGFPE SIGSEGV SIGBUS SIGSYS SIGXCPU SIGXFSZ
			一部分 do_group_exit
	handle_signal() // 有对应的用户自定义处理函数,则执行用户态处理函数 // 捕获第二步
		compat_setup_frame // 构造返回堆栈,将返回地址替换为 用户注册的信号处理函数
		user_fastforward_single_step // 切换到用户态
	重启被中断的system call


用户信号执行完毕如何返回?

  • 内核线程 的 receive
    if (signal_pending(current))
    {
        // 自定义信号处理函数
    }
    flush_signals(current);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值