我尝试使用流程和fork()
来更好地了解它们的工作原理。现在,我正在尝试编写一个程序,该程序接受shell输入并将来自父进程的输入k
到q
的整数写入子进程。这是我的代码到目前为止,我不明白它为什么不能正常工作,我关闭了所有的管道并且代码非常小。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* pipe, fork */
#include <sys/wait.h> /* wait */
#include <sys/types.h> /* pid_t */
void testProc(int k, int q){
pid_t new_proc;
int fd[2];
pipe(fd);
new_proc = fork();
int w;
if (new_proc > 0) {
close(fd[0]);
for(w=k; w < q; w++) {
write(fd[1], &w,sizeof(int));
printf("Wrote %i out of %i\n", k, q);
}
close(fd[1]);
}
else if (new_proc == 0) {
close(fd[1]);
while(read(fd[0], &w, sizeof(int) ) > 0) {
printf("Child received %i out of %i from Parent.\n", k, q);
}
close(fd[0]);
exit(1);
}
else{
printf("Fork failed\n");
exit(1);
}
}
int main(int argc, char *argv[]) {
int n, m;
if (argc != 3) {
fprintf(stderr, "Need 3 arguments\n");
return -1;
}
m = atoi(argv[2]);
n = atoi(argv[1]);
testProc(n, m);
return 0;
}
我意识到此代码应该检查其他系统调用,例如close()
read
和write
,我也理解使用atoi
是一个坏主意。我在我的问题中跳过这些事情,使其尽可能简洁。
我运行./testProc 4 8
Wrote 4 out of 8
Wrote 4 out of 8
Wrote 4 out of 8
Wrote 4 out of 8
Child received 4 out of 8 from Parent.
Child received 4 out of 8 from Parent.
Child received 4 out of 8 from Parent.
Child received 4 out of 8 from Parent.
它只获得第一个价值,我不明白为什么?如果不是这样的话,如何在进程之间从k
传递整数流到q
?谢谢!
答案 0 :(得分:1)
似乎是你的
printf("Wrote %i out of %i\n", k, q);
应该是
printf("Wrote %i out of %i\n", w, q);
^^
w here
在子进程中将其打印出来时相同。