查询linux信号量命令,linux下的trap命令和SIGHUP信号量详解。
19) SIGSTOP 停止(stopped)進(jìn)程的執(zhí)行. 注意它和terminate以及interrupt的區(qū)別: 該進(jìn)程還未結(jié)束, 只是暫停執(zhí)行. 本信號(hào)不能被阻塞, 處理或忽略.
20) SIGTSTP 停止進(jìn)程的運(yùn)行, 但該信號(hào)可以被處理和忽略. 用戶鍵入SUSP字符時(shí)(通常是Ctrl-Z)發(fā)出這個(gè)信號(hào)
21) SIGTTIN 當(dāng)后臺(tái)作業(yè)要從用戶終端讀數(shù)據(jù)時(shí), 該作業(yè)中的所有進(jìn)程會(huì)收到SIGTTIN信號(hào). 缺省時(shí)這些進(jìn)程會(huì)停止執(zhí)行.
22) SIGTTOU 類似于SIGTTIN, 但在寫終端(或修改終端模式)時(shí)收到.
23) SIGURG 有緊急數(shù)據(jù)或out-of-band數(shù)據(jù)到達(dá)socket時(shí)產(chǎn)生.
24) SIGXCPU 超過(guò)CPU時(shí)間資源限制. 這個(gè)限制可以由getrlimit/setrlimit來(lái)讀取/改變
25) SIGXFSZ 超過(guò)文件大小資源限制.
26) SIGVTALRM 虛擬時(shí)鐘信號(hào). 類似于SIGALRM, 但是計(jì)算的是該進(jìn)程占用的CPU時(shí)間.
27) SIGPROF 類似于SIGALRM/SIGVTALRM, 但包括該進(jìn)程用的CPU時(shí)間以及系統(tǒng)調(diào)用的時(shí)間.
28) SIGWINCH 窗口大小改變時(shí)發(fā)出.
29) SIGIO 文件描述符準(zhǔn)備就緒, 可以開始進(jìn)行輸入/輸出操作.
30) SIGPWR Power failure
對(duì)于2和3信號(hào)量好理解,屏蔽ctrl+c和ctrl+\。但是1信號(hào)量到底什么作用呢?
轉(zhuǎn)自http://blog.csdn.net/cugxueyu/archive/2008/01/16/2046565.aspx
SIGHUP信號(hào)與控制終端
UNIX中進(jìn)程組織結(jié)構(gòu)為 session (會(huì)話)包含一個(gè)前臺(tái)進(jìn)程組及一個(gè)或多個(gè)后臺(tái)進(jìn)程組,一個(gè)進(jìn)程組包含多個(gè)進(jìn)程。一個(gè)session可能會(huì)有一個(gè)session首進(jìn)程,而一個(gè)session首進(jìn)程可能會(huì)有一個(gè)控制終端。一個(gè)進(jìn)程組可能會(huì)有一個(gè)進(jìn)程組首進(jìn)程。進(jìn)程組首進(jìn)程的進(jìn)程ID與該進(jìn)程組ID相等。這兒是可能會(huì)有,在一定情況之下是沒有的。與終端交互的進(jìn)程是前臺(tái)進(jìn)程,否則便是后臺(tái)進(jìn)程。
SIGHUP會(huì)在以下3種情況下被發(fā)送給相應(yīng)的進(jìn)程:
1、終端關(guān)閉時(shí),該信號(hào)被發(fā)送到session首進(jìn)程以及作為job提交的進(jìn)程(即用 & 符號(hào)提交的進(jìn)程)
2、session首進(jìn)程退出時(shí),該信號(hào)被發(fā)送到該session中的前臺(tái)進(jìn)程組中的每一個(gè)進(jìn)程
3、若父進(jìn)程退出導(dǎo)致進(jìn)程組成為孤兒進(jìn)程組,且該進(jìn)程組中有進(jìn)程處于停止?fàn)顟B(tài)(收到SIGSTOP或SIGTSTP信號(hào)),該信號(hào)會(huì)被發(fā)送到該進(jìn)程組中的每一個(gè)進(jìn)程。
系統(tǒng)對(duì)SIGHUP信號(hào)的默認(rèn)處理是終止收到該信號(hào)的進(jìn)程。所以若程序中沒有捕捉該信號(hào),當(dāng)收到該信號(hào)時(shí),進(jìn)程就會(huì)退出。
下面觀察幾種因終端關(guān)閉導(dǎo)致進(jìn)程退出的情況,在這兒進(jìn)程退出是因?yàn)槭盏搅薙IGHUP信號(hào)。login shell是session首進(jìn)程。
首先寫一個(gè)測(cè)試程序,代碼如下:
#include
#include
char **args;
void exithandle(int sig)
...{
printf("%s : sighup received ",args[1]);
}
int main(int argc,char **argv)
...{
args = argv;
signal(SIGHUP,exithandle);
pause();
return 0;
}
程序中捕捉SIGHUP信號(hào)后打印一條信息,pause()使程序暫停。
編譯后的執(zhí)行文件為sigtest。
1、命 令:sigtest front > tt.txt
操 作:關(guān)閉終端
結(jié) 果:tt.txt文件的內(nèi)容為front : sighup received
原 因: sigtest是前臺(tái)進(jìn)程,終端關(guān)閉后,根據(jù)上面提到的第1種情況,login shell作為session首進(jìn)程,會(huì)收到SIGHUP信號(hào)然后退出。根據(jù)第2種情況,sigtest作為前臺(tái)進(jìn)程,會(huì)收到login shell發(fā)出的SIGHUP信號(hào)。
2、命 令:sigtest back > tt.txt &
操 作:關(guān)閉終端
結(jié) 果:tt.txt文件的內(nèi)容為 back : sighup received
原 因: sigtest是提交的job,根據(jù)上面提到的第1種情況,sigtest會(huì)收到SIGHUP信號(hào)。
3、命 令:寫一個(gè)shell,內(nèi)容為[sigtest &],然后執(zhí)行該shell
操 作:關(guān)閉終端
結(jié) 果:ps -ef | grep sigtest 會(huì)看到該進(jìn)程還在,tt文件為空
原 因: 執(zhí)行該shell時(shí),sigtest作為job提交,然后該shell退出,致使sigtest變成了孤兒進(jìn)程,不再是當(dāng)前session的job了,因此sigtest即不是session首進(jìn)程也不是job,不會(huì)收到SIGHUP。同時(shí)孤兒進(jìn)程屬于后臺(tái)進(jìn)程,因此login shell退出后不會(huì)發(fā)送SIGHUP給sigtest,因?yàn)樗粚⒃撔盘?hào)發(fā)送給前臺(tái)進(jìn)程。第3條說(shuō)過(guò)若進(jìn)程組變成孤兒進(jìn)程組的時(shí)候,若有進(jìn)程處于停止?fàn)顟B(tài),也會(huì)收到SIGHUP信號(hào),但sigtest沒有處于停止?fàn)顟B(tài),所以不會(huì)收到SIGHUP信號(hào)。
4、命 令:nohup sigtest > tt
操 作:關(guān)閉終端
結(jié) 果:tt文件為空
原 因: nohup可以防止進(jìn)程收到SIGHUP信號(hào)
至此,我們就清楚了何種情況下終端關(guān)閉后進(jìn)程會(huì)退出,何種情況下不會(huì)退出。
要想終端關(guān)閉后進(jìn)程不退出有以下幾種方法,均為通過(guò)shell的方式:
1、編寫shell,內(nèi)容如下
trap "" SIGHUP #該句的作用是屏蔽SIGHUP信號(hào),trap可以屏蔽很多信號(hào)
sigtest
2、nohup sigtest 可以直接在命令行執(zhí)行,
若想做完該操作后繼續(xù)別的操作,可以 nohup sigtest &
3、編寫shell,內(nèi)容如下
sigtest &
其實(shí)任何將進(jìn)程變?yōu)楣聝哼M(jìn)程的方式都可以,包括fork后父進(jìn)程馬上退出。
總結(jié)
以上是生活随笔為你收集整理的查询linux信号量命令,linux下的trap命令和SIGHUP信号量详解。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux查看文件句柄阀值,promet
- 下一篇: linux 密码策略设置,设置Linux