尝试从管道读取到字符串,但它不读取整个字符串

时间:2016-05-11 22:13:12

标签: c malloc pipe fork

我正在使用子进程来执行sha1sum程序。对于某些上下文,基本上sha1sum将获取一个文件并为其创建一个唯一的代码。 (没有做到这一点,但这并不重要)。 代码长度为40个字符。

因此,我的子进程将执行它,父进程将保存代码并将其放入缓冲区。 我构建了一个主要功能来测试它是否正在做我想要的东西,我注意到String还没有完成。我认为它是一个malloc问题。我评论了代码为什么我这么认为。

char* getN(char *name){
int fd[2],pid;
char *buffer = (char*)malloc(41*sizeof(char));

pipe(fd);
pid=fork();

if(!pid){
    close(fd[0]);
    dup2(fd[1],1);
    close(fd[1]);
    execlp("sha1sum","sha1sum",name,NULL);
}
else{
    close(fd[1]);
    read(fd[0],buffer,sizeof(buffer)); /* if i change this sizeof to like sizeof(buffer)+2 it prints 2 more chars than it previously did. no clue why. */
    close(fd[0]);
    wait(NULL);
}
return buffer;
}



int main(){
    char *a=getN("file.pdf"); // file that's in my current directory.
    printf("%s\n",a);
    return 0;
}

感谢。

1 个答案:

答案 0 :(得分:1)

buffer是一个指针,而不是一个静态数组,因此sizeof(buffer)返回一个指针的大小。 (4位在32位架构上,8位在64位上)。当你调用read时,你不想要指针的大小,你想要它所指向的数据的大小,所以你需要传入你作为参数传递给malloc的相同值(在这种情况下, 41)。