Rumah >Operasi dan penyelenggaraan >operasi dan penyelenggaraan linux >Untuk apa isyarat linux digunakan?
Isyarat Linux digunakan untuk memberitahu proses kejadian peristiwa tertentu atau untuk membiarkan proses melaksanakan fungsi pemprosesan tertentu ialah mekanisme komunikasi purba dalam keluarga Unix; papan kekunci Input aksara, seperti SIGINIT yang dicetuskan oleh kawalan-C, juga boleh datang daripada pengecualian yang berkaitan dengan perkakasan atau perisian, seperti SIGSEGV yang dicetuskan oleh aplikasi yang mengakses alamat yang tidak sah, SIGALARM yang dicetuskan oleh tamat tempoh pemasa, dsb.
Persekitaran pengendalian tutorial ini: sistem linux5.9.8, komputer Dell G3.
Apakah isyarat linux digunakan?
Mekanisme pemprosesan isyarat dalam Linux
Isyarat ialah mekanisme komunikasi purba dalam keluarga Unix Ia digunakan terutamanya untuk memberitahu proses berlakunya peristiwa tertentu, atau untuk membenarkan Sesuatu proses melaksanakan fungsi pemprosesan tertentu. Ia dikatakan kuno kerana ia telah wujud pada generasi pertama sistem Unix.
Isyarat boleh datang daripada input aksara papan kekunci terminal, seperti SIGNIT yang dicetuskan oleh kawalan-C ia juga boleh datang daripada perkakasan atau perisian Keabnormalan yang berkaitan, seperti SIGSEGV (kesalahan segmentasi) yang dicetuskan oleh aplikasi yang mengakses alamat yang tidak sah, SIGALARM yang dicetuskan oleh tamat tempoh pemasa, dsb. Isyarat ini dihantar ke proses oleh kernel.
Isyarat yang diterima oleh proses juga boleh datang daripada proses lain. Tetapi tidak semua proses boleh menghantar isyarat kepada mana-mana proses lain Hanya pengguna super dengan kebenaran root boleh melakukan ini Untuk proses pengguna biasa, mereka hanya boleh menghantar isyarat kepada proses milik pengguna yang sama.
Bolehkah proses menghantar isyarat kepada kernel? Ia mungkin, tetapi benang kernel tidak akan bertindak balas, dan ia akan menjadi sia-sia melainkan... anda mengubah suai kod kernel.
Biasanya isyarat dianggap sebagai mekanisme tak segerak, tetapi dalam kod Linux, isyarat berikut yang disebabkan oleh pengecualian juga dipanggil "segerak":
#define SYNCHRONOUS_MASK \ (sigmask(SIGSEGV) | sigmask(SIGBUS) | sigmask(SIGILL) | \ sigmask(SIGTRAP) | sigmask(SIGFPE) | sigmask(SIGSYS))
Di sini kami memanggil proses yang menerima isyarat "proses sasaran". Fungsi penghantaran isyarat tradisional ialah bunuh(). Nama ini kelihatan sangat menakutkan, dan rasanya proses sasaran akan "dibunuh". Malah, walaupun semua isyarat dihantar menggunakan kill(), hanya sebahagian kecil daripada proses yang sebenarnya perlu "dibunuh". Sudah tentu, kini terdapat sigqueue() dengan fungsi yang lebih berkuasa dan nama yang lebih mesra.
Mari kita lihat prototaip fungsi kedua-duanya:
int kill(pid_t pid, int sig);int sigqueue(pid_t pid, int sig, const union sigval value);
pid mewakili PID proses sasaran. PID proses dalam Linux semuanya adalah nombor positif Jika nilai parameter pid ialah 0 atau nombor negatif, adakah ia menyalahi undang-undang? Tidak, sebenarnya, 0 dan nombor negatif mempunyai kegunaan lain di sini. Terdapat konsep kumpulan proses dalam Linux, yang mewakili koleksi proses jenis. Dalam kill(), jika parameter pid ialah "0", ia bermakna isyarat dihantar ke semua proses dalam kumpulan proses di mana proses semasa berada Jika kurang daripada "-1", isyarat dihantar ke kumpulan proses bernombor -pid.
__kill_pgrp_info(sig, info, pid ? find_vpid(-pid) : task_pgrp(current));
pid ialah "-1", yang bermaksud ia dihantar ke semua proses kecuali proses Init dan dirinya sendiri, atau semua proses dengan pid lebih besar daripada 1 kecuali dirinya sendiri.
for_each_process(p) {
if (task_pid_vnr(p) > 1 && !same_thread_group(p, current))
...
Jika pid di sini adalah PID proses itu sendiri, maka proses itu menghantar isyarat kepada dirinya sendiri. Untuk tujuan ini, Linux juga menyediakan antara muka yang lebih mudah: fungsi raise().
kill(getpid(), sig) --> raise(sig)
Perlu diambil perhatian bahawa dalam sigqueue(), anda tidak boleh menghantar isyarat kepada keseluruhan kumpulan proses dengan menetapkan nilai parameter pid kepada nombor negatif.
sig mewakili nombor isyarat yang akan dihantar Nombor isyarat dalam Linux bermula dari 1. Apakah yang akan berlaku jika nilai parameter sig ialah 0? 0 di sini juga mempunyai kesan ajaib Apabila sig ialah "0", ia sebenarnya tidak menghantar isyarat kepada proses sasaran (atau kumpulan proses), tetapi digunakan untuk mengesan sama ada proses sasaran (atau kumpulan proses) wujud.
Bagi parameter ketiga yang ditambah dengan sigqueue, takrifnya adalah seperti berikut:
union sigval {
int sival_int;
void __user *sival_ptr;};
传统的信号是没有传递消息的功能的,sigval算是稍微扩展了一下信号的通信能力。比如,通信双方可以事先约定某些事件为特定的int值,这个"sival_int"就可以用来保存具体的int值,目标进程可以据此来区分不同的事件,做出不同的响应。当然,这种方法传递的消息内容受限,且不易扩展,因而不适合用作常规的通信手段。
就算是进程之间发送信号,那也是要经过内核的,可以理解成是被内核“截获”了吧。
由于内核态和用户态的切换操作在不同的硬件体系架构上是不同的,而且有一些信号,比如SIGCHLD和SIGSTOP,其实现也是和架构相关的,所以Linux中signal机制的很多代码都是放在架构相关的目录下的,比如"/arch/arm/kernel/signal.c"。
一个信号的相关信息在内核中用siginfo_t结构体表示:
siginfo_t{
int si_signo;
int si_sicode;
union __sifields _sifields;
...}
内核在截获到一个进程发送的信号后,会首先做一系列的检查,比如该信号的值是否合法啦,进程有没有发送这个信号的权限啦。如果检查通过,就调用copy_from_user()将该信号的相关信息复制到siginfo_t结构体中。
相关推荐:《Linux视频教程》
Atas ialah kandungan terperinci Untuk apa isyarat linux digunakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!