gpt4 book ai didi

c - Linux C 编程 : Concurrent reads/writes to same file descriptor

转载 作者:行者123 更新时间:2023-12-02 03:42:09 30 4
gpt4 key购买 nike

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

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

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

因此,目前我打开设备的单个文件描述符并串行执行读取和写入。我想采用线程方法,但我想知道并发的 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);

关于c - Linux C 编程 : Concurrent reads/writes to same file descriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19417626/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com