• 首页
  • 中国
  • OK6410A 开发板 (八) 61 linux-5.11 OK6410A 进程通信机制1 信号

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

2023-11-01 157浏览
百检网是一家专业的第三方检测平台,汇聚众多拥有权威资质的第三方检测机构为你提供一站式的检测服务,做检测就上百检网。百检网让检测从此检测,一份报告全国通用,专业值得信赖。

信号

异步通信机制

不可靠/可靠

信号处理方式

忽略// 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);

百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台