LinuxC编程:对同一文件描述符的并发读/写

LinuxC编程:对同一文件描述符的并发读/写,c,concurrency,linux-device-driver,embedded-linux,i2c,C,Concurrency,Linux Device Driver,Embedded Linux,I2c,我正在编写一个与特定串行设备接口的程序。串行设备有两个通道,每个通道有一个硬件rx和tx缓冲器。基本上,在任何给定时间,您都可以读取/写入设备上的任一通道 我试图从一个通道读取数据,验证它(也许使用一些数据),然后传输它。读取通过对设备的iotctl调用完成,而写入通过对write()系统调用完成 我遇到的主要问题是数据吞吐量。我希望每个通道都有一个单独的线程句柄读写(即,两个通道各有一个读线程和写线程)。然而,我遇到了一个障碍。从Linux的角度来看,设备上的所有内容都是通过单个设备访问的,我

我正在编写一个与特定串行设备接口的程序。串行设备有两个通道,每个通道有一个硬件rx和tx缓冲器。基本上,在任何给定时间,您都可以读取/写入设备上的任一通道

我试图从一个通道读取数据,验证它(也许使用一些数据),然后传输它。读取通过对设备的iotctl调用完成,而写入通过对write()系统调用完成

我遇到的主要问题是数据吞吐量。我希望每个通道都有一个单独的线程句柄读写(即,两个通道各有一个读线程和写线程)。然而,我遇到了一个障碍。从Linux的角度来看,设备上的所有内容都是通过单个设备访问的,我不确定Linux是否注意到设备有多个通道

因此,目前我打开一个单一的文件描述符到设备,并执行我的读写串行。我想使用线程方法,但我想知道并发ioctl()和write()调用是否会导致问题。我理解read()和write()并不是线程安全的,但我想知道是否有办法解决这个问题(可能会调用open()两次,一次使用读取权限,一次使用写入权限)

谢谢你的帮助。此外,我想避免写我自己的驱动程序,但这可能是一个不可避免的结论


另外,作为旁注,我特别关注设备的硬件缓冲区非常小。有没有办法确定操作系统使用多少空间作为数据的软件缓冲区?也就是说,我能否确定操作系统是否有自己的缓冲区,用于防止硬件缓冲区溢出?所讨论的设备是一个I2C UART桥接器。

您可以使用信号量来在读/写线程之间进行互斥

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