在我引入共享管道之前,我的XOR加密一直通过2个子进程工作。一旦我介绍了共享管道,我发现:
这个错误是由我传递/处理管道的方式引起的,还是由于读取函数的错误陈述引起的?
我已经包含了所有代码。
#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]);
}
}
}
答案 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()
分支中执行这两项操作。