通过管道传递逐位加密到输出文件

时间:2018-04-19 17:19:16

标签: c file encryption pipe buffer

在我引入共享管道之前,我的XOR加密一直通过2个子进程工作。一旦我介绍了共享管道,我发现:

  1. 两个子进程都运行
  2. 逐位加密确实与加密文件'一起运行。流程正常运行
  3. '测试'字符串永远不会打印在' writeToOutFile' function,表示永远不会调用while循环。
  4. 这个错误是由我传递/处理管道的方式引起的,还是由于读取函数的错误陈述引起的?

    我已经包含了所有代码。

        #include <stdio.h>
    ...
    
    
    
    void encrypt(....){
    
        while ((c = fgetc(in)) != EOF) { 
            ....
            }
            char x = ...;
            write(fd, &x, 1); 
    
        }
    
    close(fd);
    
    }
    
    
    void writeOut(...){
    
    char outchar;
    
    while(read(fd, &outchar, 1) > 0){ 
        ...
    }
    close(fd);
    }
    
    
    int main(...]){
    
        int fd[2];
    
        pipe(fd);
    
        pid_t ....;
        FILE ....;
    
    
    ...
    
          child_a = fork();
    
          if (child_a == 0) {
               //Child A code
                     close(fd[0]);
                     encrypt(in, fd[1], k, c); //for using write end
    
    
          } else {
              child_b = fork();
    
              if (child_b == 0) {
                   //Child B code
                             close(fd[1]);
                             writeOut(out, fd[0]); 
    
    
              } else {
                  //Parent Code
                  waitpid(child_a,NULL,0);
                    waitpid(child_b,NULL,0);
                            close(fd[1]);
                            close(fd[0]);
              }
          }
    
        }
    

1 个答案:

答案 0 :(得分:0)

你有一个简单的拼写错误:

while(read(pipe1, &outchar, 1) < 0)

应该是:

while(read(pipe1, &outchar, 1) > 0)

read()会返回已读取的字符数,在{EOF时为0,或在出现错误时返回-1。所以你的循环会立即停止,除非它立即从管道中读取EOF或者出错。

另一个问题是您需要关闭不在每个进程中使用的管道FD。管道的读取端不会返回EOF,直到所有进程将写入结束关闭它。所以在标记为//Child A code的分支中添加:

close(pipe1[0]);

并在标有//Child B code的分支中添加:

close(pipe1[1]));

并在调用//Parent code之前在waitpid()分支中执行这两项操作。