两个程序能否同时访问并写入/dev/snd下的同一MIDI设备?
关于ALSA MIDI设备并行打开的解答
核心结论
你完全可以并行打开该MIDI设备文件写入数据,不会中断原有应用1的正常运行,你的需求可以实现。
具体说明
- ALSA内核驱动实现的
/dev/snd/midiC*D*字符设备默认没有强制互斥锁,支持多进程同时打开读写,不存在单一进程独占的限制 - 你遇到的open阻塞/报资源忙的问题,首先检查路径拼写错误:你给出的应用2示例里写的是
dev/snd/midiC1D0,缺少了根路径前缀/,属于相对路径错误,修正为绝对路径/dev/snd/midiC1D0即可 - 应用2的open参数直接设置为
O_WRONLY | O_NONBLOCK即可,打开不会阻塞,也不会报错 - 单次写入1~几个字节的操作是原子的,不会和应用1的写入内容发生乱序、拼接问题,完全符合你的使用需求
- 若按上述修正后仍然打开失败,可先使用
amidi -p hw:1,0 -S "FF"命令测试写入,命令执行成功则说明是你的代码逻辑问题;若命令也报错,说明原应用1对设备加了强制文件锁,这种情况你只需要在打开后加1~2次重试逻辑即可,因为你写入耗时极短,几乎不会和应用1的锁持有时间冲突
修正后的示例代码
原有应用1(无需修改任何逻辑)
// 应用1原有逻辑 open("/dev/snd/midiC1D0", O_NONBLOCK); // ... 应用继续在后台运行原有逻辑,不会受到任何干扰 ...
你要实现的应用2
// 应用2写入逻辑 // 注意路径要写绝对路径,flags加O_NONBLOCK int fd = open("/dev/snd/midiC1D0", O_WRONLY | O_NONBLOCK); unsigned char ch = 0xFF; write(fd, &ch, 1); close(fd);
内容的提问来源于stack exchange,提问作者Cheetaiean
相关产品推荐
相关产品推荐

