CODE |
Created with colorer-take5 library. Type 'cpp' [color=#696969; ]/*[/color] [color=#696969; ] * sig_exit - cause the current task to exit due to a signal.[/color] [color=#696969; ] */[/color] void sig_exit[color=#808030; ]([/color]int sig[color=#808030; ],[/color] int exit_code[color=#808030; ],[/color] struct siginfo [color=#808030; ]*[/color]info[color=#808030; ])[/color] [color=#800080; ]{[/color] struct task_struct [color=#808030; ]*[/color]t[color=#800080; ];[/color] sigaddset[color=#808030; ]([/color][color=#808030; ]&[/color]amp[color=#800080; ];[/color]current[color=#808030; ]-[/color][color=#808030; ]>[/color]pending[color=#808030; ].[/color]signal[color=#808030; ],[/color] sig[color=#808030; ])[/color][color=#800080; ];[/color] recalc_sigpending[color=#808030; ]([/color]current[color=#808030; ])[/color][color=#800080; ];[/color] current[color=#808030; ]-[/color][color=#808030; ]>[/color]flags \[color=#808030; ]|[/color][color=#808030; ]=[/color] PF_SIGNALED[color=#800080; ];[/color] [color=#696969; ]/* Propagate the signal to all the tasks in[/color] [color=#696969; ] * our thread group [/color] [color=#696969; ] */[/color] if [color=#808030; ]([/color]info [color=#808030; ]&[/color]amp[color=#800080; ];[/color][color=#808030; ]&[/color]amp[color=#800080; ];[/color] [color=#808030; ]([/color]unsigned long[color=#808030; ])[/color]info [color=#808030; ]![/color][color=#808030; ]=[/color] [color=#008c00; ]1[/color] [color=#808030; ]&[/color]amp[color=#800080; ];[/color][color=#808030; ]&[/color]amp[color=#800080; ];[/color] info[color=#808030; ]-[/color][color=#808030; ]>[/color]si_code [color=#808030; ]![/color][color=#808030; ]=[/color] SI_TKILL[color=#808030; ])[/color] [color=#800080; ]{[/color] read_lock[color=#808030; ]([/color][color=#808030; ]&[/color]amp[color=#800080; ];[/color]tasklist_lock[color=#808030; ])[/color][color=#800080; ];[/color] for_each_thread[color=#808030; ]([/color]t[color=#808030; ])[/color] [color=#800080; ]{[/color] force_sig_info[color=#808030; ]([/color]sig[color=#808030; ],[/color] info[color=#808030; ],[/color] t[color=#808030; ])[/color][color=#800080; ];[/color] [color=#800080; ]}[/color] read_unlock[color=#808030; ]([/color][color=#808030; ]&[/color]amp[color=#800080; ];[/color]tasklist_lock[color=#808030; ])[/color][color=#800080; ];[/color] [color=#800080; ]}[/color] do_exit[color=#808030; ]([/color]exit_code[color=#808030; ])[/color][color=#800080; ];[/color] [color=#696969; ]/* NOTREACHED */[/color] [color=#800080; ]}[/color] Он вызывается из архитектуро[color=#808030; ]-[/color]зависимых частей кернела[color=#808030; ],[/color] вот пример из arch[color=#808030; ]/[/color]i386[color=#808030; ]/[/color]signal[color=#808030; ].[/color]c [color=#696969; ]/* [/color] [color=#696969; ] * Note that 'init' is a special process: it doesn't get signals it doesn't [/color] [color=#696969; ] * want to handle. Thus you cannot kill init even with a SIGKILL even by [/color] [color=#696969; ] * mistake. [/color] [color=#696969; ] */[/color] int do_signal[color=#808030; ]([/color]struct pt_regs [color=#808030; ]*[/color]regs[color=#808030; ],[/color] sigset_t [color=#808030; ]*[/color]oldset[color=#808030; ])[/color] [color=#800080; ]{[/color] [color=#696969; ]/* тут я скипну чуток кода =) */[/color] switch [color=#808030; ]([/color]signr[color=#808030; ])[/color] [color=#800080; ]{[/color] case SIGCONT[color=#808030; ]:[/color] case SIGCHLD[color=#808030; ]:[/color] case SIGWINCH[color=#808030; ]:[/color] case SIGURG[color=#808030; ]:[/color] continue[color=#800080; ];[/color] case SIGTSTP[color=#808030; ]:[/color] case SIGTTIN[color=#808030; ]:[/color] case SIGTTOU[color=#808030; ]:[/color] if [color=#808030; ]([/color]is_orphaned_pgrp[color=#808030; ]([/color]current[color=#808030; ]-[/color][color=#808030; ]>[/color]pgrp[color=#808030; ])[/color][color=#808030; ])[/color] continue[color=#800080; ];[/color] [color=#696969; ]/* FALLTHRU */[/color] case SIGSTOP[color=#808030; ]:[/color] [color=#800080; ]{[/color] struct signal_struct [color=#808030; ]*[/color]sig[color=#800080; ];[/color] current[color=#808030; ]-[/color][color=#808030; ]>[/color]state [color=#808030; ]=[/color] TASK_STOPPED[color=#800080; ];[/color] current[color=#808030; ]-[/color][color=#808030; ]>[/color]exit_code [color=#808030; ]=[/color] signr[color=#800080; ];[/color] sig [color=#808030; ]=[/color] current[color=#808030; ]-[/color][color=#808030; ]>[/color]p_pptr[color=#808030; ]-[/color][color=#808030; ]>[/color]sig[color=#800080; ];[/color] if [color=#808030; ]([/color]sig [color=#808030; ]&[/color]amp[color=#800080; ];[/color][color=#808030; ]&[/color]amp[color=#800080; ];[/color] [color=#808030; ]![/color][color=#808030; ]([/color]sig[color=#808030; ]-[/color][color=#808030; ]>[/color]action[color=#808030; ][[/color]SIGCHLD[color=#808030; ]-[/color][color=#008c00; ]1[/color][color=#808030; ]][/color][color=#808030; ].[/color]sa[color=#808030; ].[/color]sa_flags [color=#808030; ]&[/color]amp[color=#800080; ];[/color] SA_NOCLDSTOP[color=#808030; ])[/color][color=#808030; ])[/color] notify_parent[color=#808030; ]([/color]current[color=#808030; ],[/color] SIGCHLD[color=#808030; ])[/color][color=#800080; ];[/color] schedule[color=#808030; ]([/color][color=#808030; ])[/color][color=#800080; ];[/color] continue[color=#800080; ];[/color] [color=#800080; ]}[/color] case SIGQUIT[color=#808030; ]:[/color] case SIGILL[color=#808030; ]:[/color] case SIGTRAP[color=#808030; ]:[/color] case SIGABRT[color=#808030; ]:[/color] case SIGFPE[color=#808030; ]:[/color] case SIGSEGV[color=#808030; ]:[/color] case SIGBUS[color=#808030; ]:[/color] case SIGSYS[color=#808030; ]:[/color] case SIGXCPU[color=#808030; ]:[/color] case SIGXFSZ[color=#808030; ]:[/color] if [color=#808030; ]([/color]do_coredump[color=#808030; ]([/color]signr[color=#808030; ],[/color] regs[color=#808030; ])[/color][color=#808030; ])[/color] exit_code \[color=#808030; ]|[/color][color=#808030; ]=[/color] [color=#008000; ]0x80[/color][color=#800080; ];[/color] [color=#696969; ]/* FALLTHRU */[/color] default[color=#808030; ]:[/color] sig_exit[color=#808030; ]([/color]signr[color=#808030; ],[/color] exit_code[color=#808030; ],[/color] [color=#808030; ]&[/color]amp[color=#800080; ];[/color]info[color=#808030; ])[/color][color=#800080; ];[/color] [color=#696969; ]/* NOTREACHED */[/color] [color=#800080; ]}[/color] [color=#800080; ]}[/color] [color=#696969; ]/* Reenable any watchpoints before delivering the [/color] [color=#696969; ] * signal to user space. The processor register will [/color] [color=#696969; ] * have been cleared if the watchpoint triggered [/color] [color=#696969; ] * inside the kernel. [/color] [color=#696969; ] */[/color] __asm__[color=#808030; ]([/color][color=#0000e6; ]"movl %0,%[/color][color=#0f69ff; ]%d[/color][color=#0000e6; ]b7"[/color] [color=#808030; ]:[/color] [color=#808030; ]:[/color] [color=#0000e6; ]"r"[/color] [color=#808030; ]([/color]current[color=#808030; ]-[/color][color=#808030; ]>[/color]thread[color=#808030; ].[/color]debugreg[color=#808030; ][[/color][color=#008c00; ]7[/color][color=#808030; ]][/color][color=#808030; ])[/color][color=#808030; ])[/color][color=#800080; ];[/color] [color=#696969; ]/* Whee! Actually deliver the signal. */[/color] handle_signal[color=#808030; ]([/color]signr[color=#808030; ],[/color] ka[color=#808030; ],[/color] [color=#808030; ]&[/color]amp[color=#800080; ];[/color]info[color=#808030; ],[/color] oldset[color=#808030; ],[/color] regs[color=#808030; ])[/color][color=#800080; ];[/color] return [color=#008c00; ]1[/color][color=#800080; ];[/color] } А вот и сам пресловутый do_exit[color=#808030; ]([/color][color=#808030; ])[/color][color=#808030; ]:[/color] NORET_TYPE void Do_exit[color=#808030; ]([/color]long code[color=#808030; ])[/color] [color=#800080; ]{[/color] struct task_struct [color=#808030; ]*[/color]tsk [color=#808030; ]=[/color] current[color=#800080; ];[/color] if [color=#808030; ]([/color]in_interrupt[color=#808030; ]([/color][color=#808030; ])[/color][color=#808030; ])[/color] panic[color=#808030; ]([/color][color=#0000e6; ]"Aiee, killing interrupt handler!"[/color][color=#808030; ])[/color][color=#800080; ];[/color] if [color=#808030; ]([/color][color=#808030; ]![/color]tsk[color=#808030; ]-[/color][color=#808030; ]>[/color]pid[color=#808030; ])[/color] panic[color=#808030; ]([/color][color=#0000e6; ]"Attempted to kill the idle task!"[/color][color=#808030; ])[/color][color=#800080; ];[/color] if [color=#808030; ]([/color]tsk[color=#808030; ]-[/color][color=#808030; ]>[/color]pid [color=#808030; ]=[/color][color=#808030; ]=[/color] [color=#008c00; ]1[/color][color=#808030; ])[/color] panic[color=#808030; ]([/color][color=#0000e6; ]"Attempted to kill init!"[/color][color=#808030; ])[/color][color=#800080; ];[/color] tsk[color=#808030; ]-[/color][color=#808030; ]>[/color]flags \[color=#808030; ]|[/color][color=#808030; ]=[/color] PF_EXITING[color=#800080; ];[/color] del_timer_sync[color=#808030; ]([/color][color=#808030; ]&[/color]amp[color=#800080; ];[/color]tsk[color=#808030; ]-[/color][color=#808030; ]>[/color]real_timer[color=#808030; ])[/color][color=#800080; ];[/color] fake_volatile[color=#808030; ]:[/color] [color=#004a43; ]#[/color]ifdef[color=#004a43; ] CONFIG_BSD_PROCESS_ACCT[/color] acct_process[color=#808030; ]([/color]code[color=#808030; ])[/color][color=#800080; ];[/color] [color=#004a43; ]#[/color]endif[color=#004a43; ] [/color] __exit_mm[color=#808030; ]([/color]tsk[color=#808030; ])[/color][color=#800080; ];[/color] lock_kernel[color=#808030; ]([/color][color=#808030; ])[/color][color=#800080; ];[/color] sem_exit[color=#808030; ]([/color][color=#808030; ])[/color][color=#800080; ];[/color] __exit_files[color=#808030; ]([/color]tsk[color=#808030; ])[/color][color=#800080; ];[/color] __exit_fs[color=#808030; ]([/color]tsk[color=#808030; ])[/color][color=#800080; ];[/color] exit_namespace[color=#808030; ]([/color]tsk[color=#808030; ])[/color][color=#800080; ];[/color] exit_sighand[color=#808030; ]([/color]tsk[color=#808030; ])[/color][color=#800080; ];[/color] exit_thread[color=#808030; ]([/color][color=#808030; ])[/color][color=#800080; ];[/color] if [color=#808030; ]([/color]current[color=#808030; ]-[/color][color=#808030; ]>[/color]leader[color=#808030; ])[/color] disassociate_ctty[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color][color=#800080; ];[/color] put_exec_domain[color=#808030; ]([/color]tsk[color=#808030; ]-[/color][color=#808030; ]>[/color]exec_domain[color=#808030; ])[/color][color=#800080; ];[/color] if [color=#808030; ]([/color]tsk[color=#808030; ]-[/color][color=#808030; ]>[/color]binfmt [color=#808030; ]&[/color]amp[color=#800080; ];[/color][color=#808030; ]&[/color]amp[color=#800080; ];[/color] tsk[color=#808030; ]-[/color][color=#808030; ]>[/color]binfmt[color=#808030; ]-[/color][color=#808030; ]>[/color]module[color=#808030; ])[/color] __MOD_DEC_USE_COUNT[color=#808030; ]([/color]tsk[color=#808030; ]-[/color][color=#808030; ]>[/color]binfmt[color=#808030; ]-[/color][color=#808030; ]>[/color]module[color=#808030; ])[/color][color=#800080; ];[/color] tsk[color=#808030; ]-[/color][color=#808030; ]>[/color]exit_code [color=#808030; ]=[/color] code[color=#800080; ];[/color] exit_notify[color=#808030; ]([/color][color=#808030; ])[/color][color=#800080; ];[/color] schedule[color=#808030; ]([/color][color=#808030; ])[/color][color=#800080; ];[/color] BUG[color=#808030; ]([/color][color=#808030; ])[/color][color=#800080; ];[/color] [color=#800080; ]}[/color] |