【问题标题】:Linux C language pipes, forks and signalsLinux C 语言管道、分叉和​​信号
【发布时间】:2015-08-19 20:40:47
【问题描述】:

我需要帮助完成家庭作业,问题是我必须通过使用进程、管道、分叉和​​信号来创建一个罐头装配线的模拟,我不能使用另一种 IPC 机制作为互斥体或信号量。

我知道如何分叉一个流程并生一个孩子,在这种情况下,我需要创建一个罐子,然后将它一个一个通过几个工位(子流程),工位就像熔化,绘画,包装,和这些一样。

我应该为罐子使用结构吗?还是子进程的PID?

问题是我如何将罐头从 A 站发送到 B 站,然后从 B 站发送到 C 并且使用管道,我知道如何使用管道从父级向一个子级发送消息,但在这种情况下我需要与所有的孩子(站)沟通

此外,这必须在使用 QT 或 GTK 的 GUI 上(我更喜欢 GTK,即使我不太了解它似乎更简单)并且程序需要如果我暂停模拟它必须告诉我有多少罐被包装,哪个站有罐头,生成最终报告,每100罐,他们形成一个罐包,我需要说做了多少包。

我已经阅读了很多指南,看过一些视频,尝试了一些示例,但我就是不知道如何知道我现在是哪个孩子,所以我可以知道哪个站是并且知道该怎么做在那个车站,我不知道如何将罐子一一通过所有车站。

【问题讨论】:

  • c fork,exec,getpid problem 的可能重复项
  • 很遗憾,您的问题过于宽泛,无法以 StackOverflow 格式回答。您需要开始和/或针对您遇到的特定问题提出更具体的问题。祝你好运。
  • 谁告诉你互斥量和信号量是 IPC 机制是错误的。它们是进程的同步机制。
  • 我将每个站点作为一个进程;每个都可以作为字符串或字符串可序列化的数据,以便您可以通过管道推送它们。每个进程都应该从其输入管道中获取一个罐子,对其进行处理,然后将修改后的罐子通过其输出管道推送到下一个站点。罐头不必知道任何 PID;事实上什么都没有。从父母到孩子的管道与从孩子到另一个孩子的管道之间没有什么不同。
  • 好的,那么请告诉我如何使用同一个管道来通信多个子进程,以及我如何知道我在哪个子进程中? (我知道如果 fork() 返回 0 我在孩子中,但怎么知道是哪一个?)和进程之间的一小类信号?

标签: c linux process pipe signals


【解决方案1】:

来自 cmets 的建议,伪代码(转成 C 是功课,所以我不这样做):

make P-A pipe
make A-B pipe
make B-C pipe

if fork()
    // process A
    while (read can from P-A pipe)
        do something to can
        write can to A-B pipe
else if fork()
    // process B
    while (read can from A-B pipe)
        do something to can
        write can to B-C pipe
else if fork()
    // process C
    while (read can from B-C pipe)
        do something to can
        write can to final output
else
    // parent
    get can from input/file (or make a new can)
    write can to P-A pipe

【讨论】:

    猜你喜欢
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2010-12-14
    • 1970-01-01
    • 2013-11-18
    相关资源
    最近更新 更多