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对已创建
为了确保只有一个进程在读,一个进程在写,我在flock中使用了两个锁。就这样

读卡器代码:

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管道还是什么


提前感谢

这是信号灯的典型用法:

  • 创建2个信号量-一个用于读取已处理的信号,另一个用于写入进程。将每个信号量设置为值1

  • 读取进程sem_等待(2)读卡器的信号量,直到信号量>0,如果他们得到它,则将其降低到零

  • 编写进程也将对其指定的信号量执行相同的操作

  • 一个控制进程(最初也可以设置信号量)可以检查两个信号量是否都为零并分配对

  • 读写器释放信号量(再次增加1),以便下一个读写器将获得信号量


  • 为了在读写器之间传递信息,可以使用共享内存…

    这是信号量的典型用法:

  • 创建2个信号量-一个用于读取已处理的信号,另一个用于写入进程。将每个信号量设置为值1

  • 读取进程sem_等待(2)读卡器的信号量,直到信号量>0,如果他们得到它,则将其降低到零

  • 编写进程也将对其指定的信号量执行相同的操作

  • 一个控制进程(最初也可以设置信号量)可以检查两个信号量是否都为零并分配对

  • 读写器释放信号量(再次增加1),以便下一个读写器将获得信号量


  • 为了在读写器之间传递信息,可以使用共享内存…

    flock命令的语义是什么?它锁定哪个文件?谁写的?你确定它做了它应该做的吗?(我只能找到
    flock()
    函数调用的手册页,而不是包装它的命令。)看起来问题不在于flock,而在于在命名管道中写入。正如您在输出中所看到的,这两台机器不同时处于临界区。
    flock
    命令的语义是什么?它锁定哪个文件?谁写的?你确定它做了它应该做的吗?(我只能找到
    flock()
    函数调用的手册页,而不是包装它的命令。)看起来问题不在于flock,而在于在命名管道中写入。正如您在输出中所看到的,这两台机器不同时处于临界段。