我有一个问题,如何编写 C程序,创建3个子进程,从3个不同的文件读取并使用管道写入父进程。
每个孩子在写入每50个字符之间应该等待一段时间(3-10秒)。
父亲应该从管道和 将所有内容(从所有3个文件中)写入一个新文件。
答案 0 :(得分:1)
要扩展Rachit Jain的答案,您可以使用文件名创建一个数组,并使用循环计数器作为数组的索引,以了解每个子进程应打开哪个文件。当每个子进程应该处理相同的文件时,效果最好,只需并行执行。
至于管道,你真的需要三个不同的管道,每个子流程一个,或者来自孩子的数据可能会混合。使用例如select
或poll
检查来自不同管道的输入。
答案 1 :(得分:1)
首先阅读Advanced Linux Programming。
首先需要使用pipe(2)系统调用创建3个管道(重复3次)。
然后,您需要使用fork(2)系统调用创建3个子进程。在失败时处理fork
:<0
的3个可能返回值,在子项中处理==0
,在父项中处理>0
。请记住父母中的pid_t
。在每个子呼叫dup2(2)中,STDOUT_FILENO
为相关管道的输出。
最后,在父级中,使用event loop多路复用系统调用来创建一个简单的poll(2),以找出应该是read(2)
的管道在孩子身上使用sleep(3)和random(3),但不要忘记播种srand
- PRNG带有随机内容(例如{pid得到的getpid(2) {3}}添加到当前time(2) ....;或使用/dev/urandom
查看urandom(4))
如Jonathan Leffler所述,由于3 * 50小于PIPE_MAX
,您可能使用单个管道。我觉得使用事件循环更安全,更通用(如果你将50替换为500000,大于PIPE_MAX
,它将起作用。)
我认为我不想或没有时间为你做更多的功课。我给了你足够的提示。
我认为Federos Koros fedoroskoros@gmail.com
trying to pay someone做作业是非常错误的,我确实给他发了一封关于此事的私人电子邮件。问题现已删除。
答案 2 :(得分:0)
fork()在带有变量的循环中三次,比如i,并且在i = 0,i = 1和i = 2的下面放置条件。在每个条件中读取你的一个文件。
现在,休息不是一项艰巨的任务。