我想在管道上写一个大小未知的数组。从stdin读取数组的值。下面是我到目前为止编写的代码的一部分。问题是使用count
变量我正在写0字节。当我应该为我执行读取的数组分配内存?有没有更好的方法来完成这项工作?
#include<stdio.h>
#include<unistd.h>
int main(){
int fd[2];
int *values;
int *received;
pid_t child;
int count = 0;
if(pipe(fd) != 0){
perror("pipe");
}
if((child = fork()) < 0){
perror("fork");
}
else if(child == 0)
{
close(fd[0]);
while(enteringValues){
//get values from stdin
//allocating memory for each read element
count++;
}
write(fd[1],values,count*sizeof(values[0]));
close(fd[1]);
exit(0);
}
close(fd[1]);
int i;
int nbytes = read(fd[0],&received,count*sizeof(received[0]));
for(i = 0;i<count;i++){
printf("%d received \n",received[i]);
}
return 0;
}
答案 0 :(得分:1)
管道从一个地方发送字节到另一个地方。因此,您需要精确指定要发送的字节数。然后确保您的发送代码精确地发送这些字节,并且您的接收代码正好要求那些字节。
如果您希望它能够以正确的方式完成工作,请执行以下操作:
发信人:
write(f[1], &val, sizeof(int));
接收器:
for (int i = 0; i < 3; ++i)
read(f[0], &buf[i], sizeof(int));
另请注意printf(“%d”,* buff);打印数组中的第一个元素(元素为零)。
不要将接收代码更改为读取(f [0],buf,3 * sizeof(int));.你的写作不是原子的(因为你写了三次写作)所以你不能指望你的阅读。