2011-11-23 94 views
1

我在嘗試在c中編寫一個smallshell時遇到了一些問題。Unix編程 - 信號處理器

問題是:假設我爲信號處理程序編寫了一些代碼,在這種情況下,它被修改爲捕獲SIGCHLD信號,我怎麼能通知我的程序信號已被捕獲?
如果我使用全局變量,問題很簡單,但這不是我想要去做的。所以任何建議/提示將不勝感激!

這就是我現在要解決的問題。

volatile sig_atomic_t exit_status; /* <--global variabel */ 

void sigchld_handler(int signal) { 
    switch (signal) { 
    case SIGCHLD: 
     exit_status = 1; /* SIGCHLD was caught, notify program.. */ 
     break; 
    default: 
     fprintf(stderr, "Some signal catched\n"); /* not a signal of intrest */ 
     break; 
    } 
} 

//感謝

+0

絕對使用全局變量。另外,在使用'volatile'之前,請確保您閱讀[this](http://www.cs.utah.edu/~regehr/papers/emsoft08-preprint.pdf),它基本上表明(至少)普通編譯器混亂打開優化時使用'volatile'。或[內核文檔中的這一點](http://www.mjmwired.net/kernel/Documentation/volatile-considered-harmful.txt)。更何況丹尼斯里奇也反對'揮發性' – Shahbaz

+0

謝謝,我會看看它:) –

回答

2

標準解決方案是使用unix self-pipe trick。好處是管道的讀取端可以與select()epoll()一起使用,因此可以與event loops很好地集成,而無需定期輪詢原子變量的值。

1

signal(7)包含的是安全的信號處理程序來執行的功能列表; fprintf(3)不是其中之一。如果在您的外殼正在打印提示或狀態消息時孩子死亡會發生什麼?損壞的數據結構是通常的結果。 (對玩具來說這很好 - 但我不想要這樣的外殼。)

設置全局變量對信號處理程序來說是非常典型的。這是一個簡單的方法來指示進程的主要事件循環或主要處理循環,以便完成其他事情。