Unix 如何避免命名管道中出现多个写入程序?
我正在用一个命名管道编写一个程序,其中包含多个读卡器和多个写卡器。其思想是使用命名管道创建读写器对。即:Unix 如何避免命名管道中出现多个写入程序?,unix,ipc,named-pipes,multiprocess,Unix,Ipc,Named Pipes,Multiprocess,我正在用一个命名管道编写一个程序,其中包含多个读卡器和多个写卡器。其思想是使用命名管道创建读写器对。即: A读烟斗 B在管道中写入 (反之亦然) A-B对已创建 为了确保只有一个进程在读,一个进程在写,我在flock中使用了两个锁。就这样 读卡器代码: echo "[JOB $2, Part $REMAINING] Taking next machine..." VMTAKEN=$(( flock -x 200; cat $VMPIPE; )200>$J
- A读烟斗
- B在管道中写入 (反之亦然)
- A-B对已创建李>
echo "[JOB $2, Part $REMAINING] Taking next machine..."
VMTAKEN=$((
flock -x 200;
cat $VMPIPE;
)200>$JOINQUEUELOCK)
echo "[JOB $2, Part $REMAINING] Machine $VMTAKEN taken..."
编写器代码:
((
flock -x 200;
echo "[MACHINE $MACHINEID] I am inside the critical section"
echo "$MACHINEID" > $VMPIPE;
echo "[MACHINE $MACHINEID] Going outside the critical section"
)200>$VMQUEUELOCK)
echo "[MACHINE $MACHINEID] Got new Job"
我有时会遇到以下问题:
[MACHINE 3] I am inside the critical section
[JOB 1, Part 249] Taking next machine...
[MACHINE 3] Going outside the critical section
[MACHINE 1] I am inside the critical section
[MACHINE 1] Going outside the critical section
[MACHINE 1]: Got new Job
[MACHINE 3]: Got new Job
[JOB 1, Part 249] Machine 3
1 taken...
如你所见,另一位作者在读者读完之前就写了。我能做些什么来解决这个问题?我应该使用ACK管道还是什么
提前感谢这是信号灯的典型用法:
为了在读写器之间传递信息,可以使用共享内存…这是信号量的典型用法:
为了在读写器之间传递信息,可以使用共享内存…flock命令的语义是什么?它锁定哪个文件?谁写的?你确定它做了它应该做的吗?(我只能找到
flock()
函数调用的手册页,而不是包装它的命令。)看起来问题不在于flock,而在于在命名管道中写入。正如您在输出中所看到的,这两台机器不同时处于临界区。flock
命令的语义是什么?它锁定哪个文件?谁写的?你确定它做了它应该做的吗?(我只能找到flock()
函数调用的手册页,而不是包装它的命令。)看起来问题不在于flock,而在于在命名管道中写入。正如您在输出中所看到的,这两台机器不同时处于临界段。