所以我一直在为我的OS类编写代码,在我的项目中,我必须为命令行上的每个文件创建一个新的子进程,并将子信息从子进程传递给父进程。我们应该重新创建Unix的wc实用程序(我已经处理过这部分)。
到目前为止,我所尝试的是:
for(i=0; i<argcount; i++){
int pid;
pid = fork();
if(pid == 0){
/* Child Process */
/* Close read pipes */
close(l_pipe[0]);
close(w_pipe[0]);
close(c_pipe[0]);
wc(lflag, wflag, cflag, filenames[i]);
} else {
/* Parent Process for piping */
/* Close write pipes */
close(l_pipe[1]);
close(w_pipe[1]);
close(c_pipe[1]);
/* Read from pipes */
read(l_pipe[0], &buffer, sizeof(count_t));
lines+=buffer;
read(w_pipe[0], &buffer, sizeof(count_t));
words+=buffer;
read(c_pipe[0], &buffer, sizeof(count_t));
bytes+=buffer;
}
}
然而,这会产生与孩子一样多的父母,这显然是错误的。我不确定我应该在哪里分叉。我有在子进程和父进程之间使用管道,并且我确定父进程需要read()与子write()s一样多次。
感谢您提供任何建议。
答案 0 :(得分:1)
我立即注意到了一些事情。
在您的子流程分支中,您未在_exit()
之后致电wc()
。这意味着您的子进程将循环并为更多的孩子开始分叉。
在您的父进程分支中,您正在等待刚刚生成的子进程的响应,然后再继续创建下一个子进程。所以基本上你已经序列化了这个过程,并且不会利用多个过程。
答案 1 :(得分:1)
除了Greg Hewgill在answer中提出的问题,我还会发现以下问题:
count_t buffer;
- 它有助于显示变量声明。如果您有某种char buffer[sizeof(count_t)]
,那么您会遇到各种各样的问题,无论大小。wc
函数可以使用它们。这不是世界末日,但通常更整洁,以避免全球变量。这是一个二阶问题;你还有其他更重要的问题需要先解决。