2017-02-13 132 views
1

我想知道一些示例程序,其中有一些中斷或信號在兩個線程之間進行通信。我衝浪並發現了一些系統調用,比如kill,tkill,tgkill和raise。但我的要求並不是要殺死進程應該像中斷一樣行事。在我的代碼中,我有這個阻塞調用。如何在兩個線程之間發送中斷或信號?

fcntl(fd, F_SETFL,0); 
    read(fd,&dataReceived.Serial_input,1); 

任何與我的要求類似的示例代碼。請做share.Thanks提前

我的代碼:

void *serial_function(void *threadNo_R) 
    { 
    int ImThreadNo = (int) threadNo_R; 
    fd = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY | O_NDELAY);// 
    if (fd == -1) 
    { 
    /* Could not open the port. */ 
     perror("open_port: Unable to open /dev/ttyUSB1 - "); 
    } 
    fcntl(fd, F_SETFL,0); 
    while(1) 
    { 
    read(fd,&dataReceived.Serial_input,1); 
    printf("\n From serial fn: Serial_input is:%c\n",dataReceived.Serial_input);  
    dataReceived.t2=dataReceived.Serial_input; 
    if(V_buf.power_window_data.front_right_up>=1) 
    { 
     sprintf(cmd,"Window is raising=%d",V_buf.power_window_data.front_right_up); 
     do 
     { 
      writenornot = write(fd, &cmd[spot], 1); 
      spot++; 
     } while (cmd[spot-1] != '\0'); 
     spot=0; 
     // 
     if (writenornot < 0) 
     { 
     printf("Write Failed \n"); 
     } 
     else 
     printf("Write successfull \n");  
    // write(fd,"DOWN",4); 

    } 
     print_screen=1; 
    } 
    } 

接收FUNC:

void *receive_function(void *threadNo_R) 
{ 
int ImThreadNo = (int) threadNo_R; 

    while(1) 
    { 
    if(msgrcv(R_msgid,&V_buf,sizeof(struct vehicle)+1,1,0) == -1) 
    { 
     printf("\n\nError failed to receive:\n\n"); 
    } 
    } 
} 

我想從發送接收應當由串行函數處理函數信號。

+0

從長遠來看,使用非阻塞IO和'select'會更快樂一點,但是對於已有的代碼的最小更改,'tkill'就是您想要的 - 您只需爲SIGUSR1安裝一個_handler_ ',設置爲_不重新啓動_系統調用,並且在那裏。 – zwol

+0

如何安裝SIGUSR1處理程序? – Sri

+0

你應該可以自己回答這個問題。首先閱讀'sigaction'手冊頁。 – zwol

回答

1

serial_function()您的serial_function()充滿了對不是異步信號安全的函數的調用。它完全不適合用作信號處理程序或從一個被調用。

有可能建立一個線程,其中serial_function()按需異步運行,但似乎不符合您打斷read()調用的目標。

您可能可能會設置一個信號處理程序,它自己通知serial_function()正在等待進行的線程,而不是在接收信號的線程中運行該函數。目前還不清楚這是否能滿足您的需求。

或者,您可能會從您的read()中發現EINTR錯誤,並直接致電serial_function()作爲迴應。但是,請注意,如果read()已成功傳輸任何數據(在當前調用中),則此替代方法不會導致serial_function()運行。

在任何情況下,您都可以通過pthread_kill()在您選擇的線索中發出信號,但在此之前您必須對策略進行整理。