【问题标题】:how to send interrupt or signal between two threads?如何在两个线程之间发送中断或信号?
【发布时间】:2017-02-13 12:23:17
【问题描述】:

我想了解一些示例程序,其中一些中断或信号在两个线程之间进行通信。我浏览并发现了一些系统调用,如 kill、tkill、tgkill 和 raise。但我的要求是不杀死进程它应该表现为中断。在我的代码中,我有这个阻塞调用。

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

任何与我的要求相似的示例代码。请分享。在此先感谢

我的代码:

    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;
    }
  }

接收函数:

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");
    }   
  }
} 

我想从接收函数发送信号,应该由串行函数处理。

【问题讨论】:

  • 从长远来看,使用非阻塞 IO 和 select,您会更快乐,但是对于您已有的代码的最小更改,tkill 是您想要的 - 您只需要安装SIGUSR1handler,设置为 not restart 系统调用,就可以了。
  • 如何安装处理程序 SIGUSR1?
  • 您应该能够自己回答这个问题。首先阅读 sigaction 手册页。
  • 是的会看看@zwol
  • kill 不会终止进程——它只是发送一个信号。当有许多其他 IPC 机制可用时,为什么要在线程之间发送中断。另外,如果有两个或多个线程将自己指定为信号处理程序并且它们都做不同的事情,那么您如何判断哪个线程正在处理它?

标签: c linux pthreads ipc


【解决方案1】:

您的serial_function() 充满了对非异步信号安全的函数的调用。它完全不适合用作信号处理程序或被调用。

可以设置一个线程,让serial_function() 按需异步运行,但这似乎不符合您中断read() 调用的目标。

您可以设置一个信号处理程序,它本身会通知serial_function() 正在等待继续的线程,而不是在接收信号的线程中运行该函数。尚不清楚这是否能满足您的需求。

或者,您可以从您的read() 中捕获EINTR 错误并直接调用serial_function() 作为响应。但是请注意,如果read() 在成功传输任何数据后(在当前调用中)被中断,则此替代方案不会导致serial_function() 运行。

在任何情况下,您都可以通过pthread_kill() 在您选择的线程中发出信号,但您必须先整理好您的策略,然后才能有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多