Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何取消vxworks或linux上被阻止的读/录系统调用_C_Linux_Unix_Vxworks - Fatal编程技术网

C 如何取消vxworks或linux上被阻止的读/录系统调用

C 如何取消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

在任务一中:

在任务二中:

在任务II中应如何取消被阻止的任务I

在vxworks中,有一个函数ioctlfd、FIOCANCEL、0来取消被阻止的读或写,但它不能工作。可能是因为驱动程序无法支持FIOCANCEL


如何在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();
}