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

时间:2013-10-17 03:15:04

标签: c concurrency linux-device-driver embedded-linux i2c

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

我正在尝试从通道读取数据,验证它(并且可能使用某些数据),然后传输它。通过对设备的iotctl调用完成读取,而通过调用write()系统调用完成写入。

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

因此,目前我向设备打开一个文件描述符并连续执行读写操作。我想转到线程方法,但我想知道并发ioctl()和write()调用是否会导致问题。我理解read()和write()而不是线程安全,但我想知道是否有任何方法(可能两次调用open(),一个具有读权限,一个具有写权限)。

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

另外,作为旁注,我特别担心该设备具有极小的硬件缓冲区。有没有办法确定操作系统用于数据软件缓冲区的空间大小?也就是说,我可以确定操作系统是否有自己的缓冲区用于防止硬件缓冲区溢出?有问题的器件是I2C UART桥。

1 个答案:

答案 0 :(得分: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);