我想知道一些示例程序,其中一些中断或信号在两个线程之间传递。我已经冲浪并发现了一些系统调用,如kill,tkill,tgkill和raise.But我的要求不是要杀死进程它应该表现为中断。在我的代码中,我有这个阻塞调用。
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");
}
}
}
我想从接收函数发送信号,该信号应由串行函数处理。
答案 0 :(得分:1)
您的serial_function()
充满了对异步信号安全的函数的调用。它完全不适合用作信号处理程序或从一个人那里调用。
可以根据需要设置serial_function()
异步运行的线程,但这似乎无法满足您打断read()
来电的目标。
您可以设置一个信号处理程序,它自己通知serial_function()
正在等待继续的线程,而不是在接收信号的线程中运行该函数。目前还不清楚这是否符合您的需求。
或者,您可能会从EINTR
收到read()
错误,并直接致电serial_function()
作为回应。但请注意,在成功传输任何数据(在当前调用中)serial_function()
被中断的情况下,此备选方案不会导致read()
运行。
在任何情况下,您都可以通过pthread_kill()
在您选择的主题中提出一个信号,但在此之前您必须先对策略进行整理。