2013-05-21 37 views
0

man 7 signal中顯示SIGUSR1爲SIGUSR1 30,10,16 Term User-defined signal 1。如果我在我的C代碼中使用SIGUSR1,我會得到值10.是否有任何方法可以訪問其他值30 & 16?是不是還好在我的信號處理程序明確地使用他們喜歡如何使用SIGUSR1替代值

if(signo == 16) 
{ 
    printf("SIGUSR1 type 2 received\n"); 
} 

編輯:在我的代碼,存在使用SIGUSR1已經case語句。我需要一個自定義信號。我知道有RTSIGNALS和其他選項。但我想知道他們爲什麼在手冊頁中指定了16,30,並且從未提供過使用它的方法。

+3

爲了便於攜帶,您應該總是使用'if(signo == SIGUSR1){}'。 –

+0

「我想知道他們爲什麼在手冊頁中指定16,30」 - 他們說爲什麼;看到我的答案。 –

回答

3

的手冊說

幾個信號數是依賴於體系結構,如在「值」列中指示。 (在給定三個值的情況下,第一個值通常對alpha和sparc有效,對於i386,ppc和sh中間的那個通常是有效的,對於mips來說,最後一個值是A - 表示信號在相應的架構上不存在。)

SIGUSR1在你運行的任何機器上都會有一個值......沒有替代值;只需使用定義的常量SIGUSR1即可。使用16將會給你錯誤的信號......再看一下表格,你會看到SIGSTKFLT。

我需要更多的自定義信號

這有什麼錯SIGUSR2?

+0

對。在我的機器上,'kill -l'顯示信號的當前值,據此,30是'SIGPWR',16是'SIGSTKFLT'(所以沒有SIGUSR1)。 – Alfe

+0

@Alfe「那麼沒有SIGUSR1」 - 似乎不太可能。但是kill -l只是從代碼中打印出一些靜態字符串......它不是權威的。也就是說,它知道像SIGUSR1這樣的符號的編譯時間值,但它不知道哪些值實際上已定義或可用。 –

+0

這不是權威性的,但它是系統上實際使用的內容。 'kill'源代碼與當前系統匹配(並希望與之保持一致)。 – Alfe

0

信號只是從一個進程發送到另一個進程的數字。只有在像SIGKILL這樣的罕見情況下,系統纔會專門干涉和處理;默認的是將信號編號發送給其他進程並讓它處理。爲了將其包裝起來並使其具有可移植性,對於哪種情況(以及支持這些約定的列表#define),有一些編號用於約定。其中一些慣例在POSIX標準中被推廣,其中man 7 signal指的是。

您完全可以隨意使用信號(例如,通過使用數字而不使用任何#define s)。請注意,由此你可能會失去可移植性和可理解性。 (維護你的代碼的下一個開發人員可能想要爲此而殺了你。)

1

SIGUSR1值取決於平臺.SIGUSR1可以是30,10或16.例如,基於x86的Linux將SIGUSR1定義爲10.實際上,使用SIGUSR1的Linux的唯一風格是DEC Alpha和SPARC。