C 如何取消vxworks或linux上被阻止的读/录系统调用
在任务一中: 在任务二中: 在任务II中应如何取消被阻止的任务I 在vxworks中,有一个函数ioctlfd、FIOCANCEL、0来取消被阻止的读或写,但它不能工作。可能是因为驱动程序无法支持FIOCANCELC 如何取消vxworks或linux上被阻止的读/录系统调用,c,linux,unix,vxworks,C,Linux,Unix,Vxworks,在任务一中: 在任务二中: 在任务II中应如何取消被阻止的任务I 在vxworks中,有一个函数ioctlfd、FIOCANCEL、0来取消被阻止的读或写,但它不能工作。可能是因为驱动程序无法支持FIOCANCEL 如何在vxworks和linux中编写任务II?或者有其他的方法来完成我的任务吗?< /P> < P>不要使用阻塞IO,这是创建一个没有可到达的退出条件的线程的典型案例,我认为这是一个错误。关于如何运行线程的最简单示例如下: volatile bool _threadRunning
如何在vxworks和linux中编写任务II?或者有其他的方法来完成我的任务吗?< /P> < P>不要使用阻塞IO,这是创建一个没有可到达的退出条件的线程的典型案例,我认为这是一个错误。关于如何运行线程的最简单示例如下:
volatile bool _threadRunning = true;
void taskI()
{
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
while (_threadRunning == true)
{
ret = read(fd, buf, size);
if (ret > 0)
{
// process buffer
}
else
{
// sleep for 1 millisecond or so...
}
}
close(fd);
}
void taskII()
{
_threadRunning = false;
_taskI.join();
}
在linux上不可能取消读取/接收ROM调用。不能使用相同的API编写这些任务。在Linux上,您可以使用epoll和O_NONBLOCK来创建取消读取/接收ROM的语义
在linux和vxworks中使用相同的代码是不可能做到这一点的。接收到信号将导致读取返回-1和errno eintrame任务I接收到信号?我正在阻止的任务?它如何调用接收信号函数?假设您使用Linux并且知道任务1的进程id,那么您可以通过调用任务2中的killpid、SIGUSR1向它发送信号。这将导致读取返回-1。Errno将被设置为EINTR。@张宝磊您知道如何取消VxWorks上的阻止读取任务了吗?我在申请中遇到了同样的问题。
...
running = true;
/* ioctl(fd, FIOCANCEL, 0); */
close(fd); /* Or: close(sock);*/
volatile bool _threadRunning = true;
void taskI()
{
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
while (_threadRunning == true)
{
ret = read(fd, buf, size);
if (ret > 0)
{
// process buffer
}
else
{
// sleep for 1 millisecond or so...
}
}
close(fd);
}
void taskII()
{
_threadRunning = false;
_taskI.join();
}