2015-06-30 64 views
1

我用C++做了我的第一個linux服務。我該如何讓我的linux服務觸發我的信號?

pid_t pid, sid; 

pid = fork(); 
if (pid < 0) { 
    exit(EXIT_FAILURE); 
} 
if (pid>0) { 
    exit(EXIT_SUCCESS); 
} 

umask(0); 

sid = setsid(); 
if (sid < 0) { 
    exit(EXIT_FAILURE); 
} 

if ((chdir("/")) < 0) { 
    exit(EXIT_FAILURE); 
} 

close(STDIN_FILENO); 
close(STDOUT_FILENO); 
close(STDERR_FILENO); 

while (1) { 
    ???????? 
    //sleep(10); 
} 

exit(EXIT_SUCCESS); 

會是什麼做的是等待我的信號,當它接收它做一些任務,然後再等待我的下一個信號。

我會發送我的信號(或其他)從我的c + +應用程序運行在同一臺機器。看起來像兩個應用程序之間的信號機制。但在這種情況下,一個是Linux服務,我不知道該服務如何等待我的信號。

我怎麼能做到這一點?我有什麼選擇?

謝謝。

注意:「信號」一詞造成混淆。我不打算在技術上使用這個詞。我的意思是我需要從我的cpp應用程序中與我的linux服務進行交流。

注2:使用信號是沒有用的,因爲在其處理程序中幾乎做任何事情都是不安全的,而我需要做很多事情。 (我不知道我是否可以啓動一個線程,至少!)

+0

你是什麼意思的「信號」呢?你的「服務器」應該是做什麼的?在同一個系統上的兩個進程之間的通信只是正常的[進程間通信](http://en.wikipedia.org/wiki/Inter-process_communication),一個進程在後臺運行並不重要。 –

+0

['sigwait'](http://linux.die.net/man/3/sigwait),如果你真的意味着信號 – Diego

+0

我不特別指任何事情。只是我想從我的cpp應用程序中與我的linux服務進行通信。 –

回答

1

這裏是一個處理程序的例子,照顧SIGHUP和SIGTERM,您的程序可以使用kill -9 processidkill -HUP processid發送這些信號當然有一些你可以使用用於此目的的其它信號檢查man signal

void handler (int signal_number){ 
    //action 
    exit(1); 
} 

,並在主程序

struct sigaction act; 
struct sigaction act2; 
memset (&act, 0, sizeof (act)); 
memset (&act2, 0, sizeof (act2)); 

act.sa_handler = handler; 
act2.sa_handler = handler; 
if (sigaction (SIGHUP, &act, NULL) < 0) { 
    perror ("sigaction"); 
} 

if (sigaction (SIGTERM, &act, NULL) < 0) { 
    perror ("sigaction"); 
} 

//wait here for ever or do something. 
+0

在處理任何事情的過程中安全嗎?我能開始一個長時間的行動嗎?或者這種方式很特殊,我們有限制? 例如在這裏告訴printf不安全:https://en.wikipedia.org/wiki/Sigaction –

+0

檢查'man signal'或[signal(7)](http://man7.org/linux/man- pages/man7/signal.7.html)中有關安全信號操作的完整章節。 –

+0

@MertKoksal我認爲我的回答是正確的我會很高興,如果你標記答案正確 –

相關問題