我创建了一个简单的程序,其中包含一个非常基本的过程:孩子写道,父亲读。 奇怪的是,父亲只读了一些奇怪的人物,我不知道为什么(我过去一小时都在努力推断为什么,但没有成功。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
// cp = Child -> Parent, pc = Parent -> child
int cp[2], pc[2];
int main (){
char str[13]="Hello World";
char received[13];
pid_t pid;
pid = fork();
if (pid == -1){
printf("An error occured!\n");
exit(1);
}
int res = pipe(cp);
if (res == -1){
printf("Error when creating pipe!..\n");
exit(1);
}
//pipe(pc);
if (pid==0){
// Child process
close(cp[0]);
write(cp[1], str, 10);
close(cp[1]);
exit(0);
}else{
// Parent process
close(cp[1]);
read(cp[0], received, 10);
close(cp[0]);
printf("We received from child: %s\n", received);
exit(1);
}
return 0;
}
产出示例: 1)我们收到了孩子:@ 2)从小孩收到了:�XCV�
答案 0 :(得分:2)
您的主要问题是您在之后创建管道,以便分叉您的流程。
int cp[2];
int res = pipe(cp); // create the pipe before
if (res == -1) {
perror("pipe()");
return 1;
}
pid_t pid = fork(); // so child and parent share the same pipe
if (pid == -1) {
perror("fork()");
return 1;
}
A tutorial关于codekaizer的管道授权。
read()
用于从文件描述符中读取字节。它不会在缓冲区的末尾添加一个空字节。
你必须自己动手:
char received[42];
ssize_t n = read(cp[0], received, sizeof received - 1);
if (n == -1) {
perror("read()");
return 1;
}
received[n] = '\0';
printf("%s\n", received);