我试图在这个程序中将信息从子进程传递给父进程。下面是到目前为止的代码,仍然在清理它:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
main() {
char *s, buf[1024];
int fds[2];
int sum;
s = "Hello world!n";
FILE *file;
pipe(fds);
if(fork()==0){
printf("child process: n");
int c;
int number;
sum = 0;
file = fopen("file1.dat", "r");
if (file) {
while ((c = getc(file)) != EOF){
sum+=c;
printf("child process: step 1");
fclose(file);
}
}
write(fds[1],&sum,12);
exit(0);
}
read(fds[0],buf,12);
write(1,buf,strlen(s));
}
它正在正确编译并且没有错误,但是当我运行它时,返回数字6后跟一堆无法识别的字符(问号)。
我还能错过什么?我的感觉告诉我一些关于阅读的事情。
编辑:我应该补充说,我的意图是让子进程打开并读取文件(其中包含多行数字)并将它们加起来,并将总数返回给父进程。
假设sizeof(int) == 4
,你写了12个任意字节(其中4个代表sum
的int
值-其他8个字节给出未定义的行为,因为它们不是sum
的"相同数组"的一部分)到管道上,然后你把它们读到buf
。然后尝试使用write()
将任意字节打印到标准输出。
你不检查任何错误;你应该。
您确实需要将字节转换回ASCII数字流以理解该值。你应该用write(fds[1], &sum, sizeof(sum))
来写,用read(fds[0], &sum, sizeof(sum))
来读,然后用printf("%dn", sum);
来打印。或者您可以自己进行转换,但仍然使用write()
打印转换后的字符串。或者您可以将sum
转换为子对象中的数字字符串。还是…