从父进程连续写入C中的子进程

时间:2014-03-13 00:03:50

标签: c process parent-child

我尝试使用流程和fork()来更好地了解它们的工作原理。现在,我正在尝试编写一个程序,该程序接受shell输入并将来自父进程的输入kq的整数写入子进程。这是我的代码到目前为止,我不明白它为什么不能正常工作,我关闭了所有的管道并且代码非常小。

#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() readwrite,我也理解使用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?谢谢!

1 个答案:

答案 0 :(得分:1)

似乎是你的

printf("Wrote %i out of %i\n", k, q);

应该是

printf("Wrote %i out of %i\n", w, q);
                               ^^ 
                              w here

在子进程中将其打印出来时相同。