2016-04-25 73 views
-1

我試圖用C++編寫一個程序,它發送信號給另一個程序,就像你在Linux中使用kill命令一樣,但似乎我遇到了一些轉換問題。正如我所看到的,我不能僅僅通過終端將信號作爲字符串(SIGINT,SIGUSR1等)傳遞並在程序中輕鬆轉換它們。我也不能通過將他們作爲他們的記者int(2,30等)並直接使用系統調用來實現我的目標。這裏是我的代碼:信號發送器轉換

的信號通過int型

#include <iostream> 
#include <csignal> 
#include <unistd.h> 
#include <cstdlib> 

using namespace std; 


int main (int argc, char* argv[]) { 
    int pid = atoi(argv[1]); 
    int signal = atoi(argv[2]); //passing signals directly as int 

    cout << signal << endl; 

    int error = kill(pid, signal); 

    if(error !=0) 
     cout << "Error sending signal to catcher program."<< endl; 
    return 0; 
} 

輸出

~$./signal_sender 5977 2 
2 
Error sending signal to catcher program. 

至於當我試圖使用字符串,我無法找到工作正常轉換。

在此先感謝。

+0

什麼是'errno'你得到'殺()'? – NPE

+0

'ESRCH 3/*沒有這樣的過程* /'所以我想我是發送信號到錯誤的PID。通過糾正它,我通過整數工作,但傳遞字符串時仍然沒有運氣。 –

+0

請參閱下面的完整答案。 – NPE

回答

1

該錯誤的兩個最可能的原因是:

  • 有沒有處理給定pid;
  • 您無權將信號發送到進程。

要弄清楚它是,打印出來並調用kill()失敗後檢查的errno值。請參閱man page以獲取的errno值列表。

至於轉換信號名稱爲數字,看How to convert signal name (string) to signal code?(簡單地說,你將極有可能有自己的信號名稱和相應數量的表格。)

+0

這是第一個。我得到了errno#3(沒有這樣的過程)。似乎它直接傳遞信號int代碼時工作,但仍然沒有字符串轉換的運氣。謝謝您的幫助。 –