在管道上写入和读取未知大小的列表

时间:2013-11-17 07:15:55

标签: c arrays linux

我想在管道上写一个大小未知的数组。从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;
}

1 个答案:

答案 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));.你的写作不是原子的(因为你写了三次写作)所以你不能指望你的阅读。