Linux C编程:同时读/写同一文件描述符

3
我正在编写一个与特定串行设备交互的程序。该串行设备有两个通道,每个通道都有一个硬件接收和发送缓冲区。基本上,在任何给定时间,您都可以在设备的任一通道上读/写。

我试图从一个通道读取数据,验证它(并可能使用其中一些数据),然后传输数据。通过iotctl调用设备进行读取,而通过调用write()系统调用来完成写入。

我主要的问题是数据吞吐量。我想为每个通道(即每个通道的读线程和写线程)设置单独的线程来处理读取和写入。但是,我遇到了一些麻烦。从Linux的角度来看,设备上的所有内容都是通过一个单一的设备访问的,并且我不确定Linux是否注意到设备具有多个通道。

因此,目前我打开了一个文件描述符以对设备执行串行读/写操作。我想采用线程方法,但我想知道并发的ioctl()和write()调用是否会导致问题。我知道read()和write()不是线程安全的,但是我想知道是否有任何方法可以解决这个问题(例如调用open()两次,一次使用读权限,一次使用写权限)。

谢谢你的帮助。我还想避免编写自己的驱动程序,但这可能是不可避免的结论...

此外,作为一个副作用,我特别关注设备具有极小的硬件缓冲区。有没有办法确定操作系统为数据使用软件缓冲器使用了多少空间?也就是说,我是否可以确定操作系统是否有自己的缓冲器,用于防止硬件缓冲区溢出?所讨论的设备是I2C UART Bridge。

1个回答

1
你可以使用信号量来实现读写线程之间的互斥。
sem_t sync_rw;

/*init semaphore */
err=sem_init(&sync_rw,0,1); /* shared between thread and initialized with 1 */
if( err != 0 )
{
    perror("cannot init semaphore \n");
    return -1;
}

在线程编写函数中,你需要这样做:
sem_wait(&sync_rw);
write(...)
sem_post(&sync_rw);

同样适用于线程阅读器:
sem_wait(&sync_rw);
iotctl(...)
sem_post(&sync_rw);

最终结果:

sem_destroy(&sync_rw);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接