T形模拟程序仅将初始输入写入文件,忽略所有顺序输入

时间:2013-12-08 22:52:56

标签: c linux operating-system

所以我有一个mytee程序(功能少得多)。试图学习如何使用管道/儿童/等

(1)我做管道 (2)创建文件
(3)叉子 (4)父母做scanf得到文本
(5)将文本发送到管道
(6)孩子接收并将其写入文件

- > #4应该是一个循环,直到用户写'。' - > #6应继续编写新行,但某处有故障。

我认为可能有些事情:
1.我的权限有问题(但O_APPEND就在那里,不知道我还需要什么)
2.父进行循环可能有问题,应该将msg发送到管道(fd [1])
3.#6我强烈认为我的问题所在。在初始写入之后它没有,继续写。我不确定我是否需要以某种方式跟踪已经写入的字节大小,但如果是这种情况,我希望最后的消息不是第一个。

我现在非常茫然

我使用

运行它
   ./mytee test1

代码:

ret = pipe (fd);
  if (ret == -1)
  {
    perror ("pipe");
    return 1;
  }
  for (i=0;i<argc-1;i++) {
     if ((filefd[i] = open(argv[i+1], O_CREAT|O_TRUNC|O_WRONLY|O_APPEND, 0644)) < 0) {
                perror(argv[i]);        /* open failed */
                return 1;
     }
  }
  pid = fork();
  if (pid==0)     /* child */
  {
   int read_data;
   do {
     read_data = read(fd[0], buffer, sizeof(buffer));
     for(i=0;i<argc;i++) {
       write(filefd[i], buffer, read_data);
     }

   } while (read_data > 1);
  for (i=0; i<argc; i++)
    close(filefd[i]);
  return 0;
  }
  else {          /* parent */
    char msg[20];
    do{
      scanf("%s",msg);
      write(fd[1],msg,sizeof(msg));
    }while (strcmp(msg,".")!=0);
    while ((pid = wait(&status)) != -1)
       fprintf(stderr, "process %d exits with %d\n", pid, WEXITSTATUS(status));
    return 0;
  }

添加输出:

$ ./a.out test1
qwe
asd
zxc
.
^C

它无法正常退出。我认为这个孩子陷入了困境 和test1的内容:

qwe

2 个答案:

答案 0 :(得分:1)

与OP一起解决这个问题,据报道问题是无条件写入msg的所有20个字节,而不是仅包含其中包含的NUL终止字符串。建议的最小修复:更改

scanf("%s",msg);
write(fd[1],msg,sizeof(msg));

scanf("%19s",msg);
write(fd[1],msg,strlen(msg));

答案 1 :(得分:0)

我看到了一些可能导致这种行为的问题。

首先,你的循环条件看起来不正确。目前,如果读取单个字节,它将终止。将其更改为:

while (read_data > 0);

我看到的另一个问题是你写的文件多于你打开的文件。确保循环到argc-1,而不是argc

for (i=0; i<argc-1; i++)