Rumah > Operasi dan penyelenggaraan > operasi dan penyelenggaraan linux > Untuk apa isyarat linux digunakan?

Untuk apa isyarat linux digunakan?

藏色散人
Lepaskan: 2023-04-10 11:17:41
asal
1567 orang telah melayarinya

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.

Untuk apa isyarat linux digunakan?

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.

Transmisi isyarat

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))
Salin selepas log masuk

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);
Salin selepas log masuk

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));
Salin selepas log masuk

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)) 
            ...
Salin selepas log masuk

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)
Salin selepas log masuk

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;};
Salin selepas log masuk

传统的信号是没有传递消息的功能的,sigval算是稍微扩展了一下信号的通信能力。比如,通信双方可以事先约定某些事件为特定的int值,这个"sival_int"就可以用来保存具体的int值,目标进程可以据此来区分不同的事件,做出不同的响应。当然,这种方法传递的消息内容受限,且不易扩展,因而不适合用作常规的通信手段。

信号的内核处理

就算是进程之间发送信号,那也是要经过内核的,可以理解成是被内核“截获”了吧。

Untuk apa isyarat linux digunakan?

由于内核态和用户态的切换操作在不同的硬件体系架构上是不同的,而且有一些信号,比如SIGCHLD和SIGSTOP,其实现也是和架构相关的,所以Linux中signal机制的很多代码都是放在架构相关的目录下的,比如"/arch/arm/kernel/signal.c"。

一个信号的相关信息在内核中用siginfo_t结构体表示:

siginfo_t{
    int si_signo;
    int si_sicode;
    union __sifields _sifields;
    ...}
Salin selepas log masuk
  • si_signo是信号的编号,从1到64的值都是合法的。
  • si_sicode记录了信号的来源,比如SI_USER表示信号是由进程调用kill()发出的,SI_QUEUE是由进程调用sigqueue()发出的,SI_KERNEL则说明该信号由内核产生的。
  • _sifields对不同的信号会有不同的含义,通常包括信号发送进程的si_pid,发送进程所属user的si_uid等。对于由sigqueue()发送的信号,还包括"sigval "参数所携带的附加信息。

内核在截获到一个进程发送的信号后,会首先做一系列的检查,比如该信号的值是否合法啦,进程有没有发送这个信号的权限啦。如果检查通过,就调用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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan