我已经有了一个应对方案,其中主要过程分叉成4点的孩子,互相配合:睡眠过程中不给信号
process0被打开FIFO文件(O_WRONLY),从每次读1个字节STDIN使用读取功能,使用写入和关闭FIFO文件写入FIFO
process1正在等待共享内存为空(我正在使用共享内存表的第一个字节if(tab [0] == 0)检查它是否为空)打开FIFO文件(O_RDONLY),从中读取,将这一个字节转换为十六进制并将其保存到共享内存中。然后它关闭FIFO和设置标签[0],这是共享存储器表1。
过程2是从共享存储器读出,如果标签[0] == 1看完之后将数据写入管道
process3被从管道读取并写入STDIN
这一切都很完美。当我想添加信号时,问题就开始了。我使用信号量来同步p0和p1,同步p1和p2的信号以及消息队列来同步p2和p3。除了例如process1处于休眠模式的时间以外,它也可以正常工作。当它想要从FIFO中读取并且必须等待数据被传输时,它进入这种模式。我想。我一直在阅读。
这里是我发现,我认为可能的原因:
“当过程进行系统调用,而在用户模式(1),它进入状态2的地方开始以内核模式运行,此时假定系统调用是读取硬盘上的一个文件,因为读取不是立即执行,进程进入休眠状态,等待系统读取的事件磁盘和数据已准备就绪,现在处于状态4.数据准备就绪后,进程被唤醒,这并不意味着它立即运行,而是再次准备在主内存中运行(3)。 “
我想我明白了,但我该如何避免这种情况?我希望我的程序始终对信号做出反应。当我通过“kill”发送信号时,是否有某种方法可以将进程状态从睡眠状态更改为运行状态?我能否以某种方式告诉进程停止“等待系统读取了磁盘并且数据已准备好”的事件?
,这里是我的代码,如果有人想看看吧: