我在一个循环中,我想把从fifo中读取的值保存在一个变量中。
char *tmp=NULL;
char *opts=NULL;
char break_[]="DONE\n";
int byte_;
while(1){
pipe_r = open(pipe_r_n, O_RDONLY);
if(pipe_r==-1){
exit(100);
}
read(pipe_r,&byte,sizeof(int));
opts=malloc((byte+1)*sizeof(char));
if (!opts) {
free(opts);
opts = NULL;
close(pipe_r);
exit(102);
}
read(pipe_r,opts,byte*sizeof(char));
printf("ho letto: %s",opts);
close(pipe_r);
if(strcmp(opts,break_)==0){
break;
}
free(opts);opts=NULL;tmp=NULL;
}
free(opts);opts=NULL;tmp=NULL;
byte_ int是后面需要读取的字节数。它在开始的时候说读取了0个字节,但也打印(read not waiting(?)).然后它用正确的字节数读取一行,之后什么都不读,但用同样的字节数......有时它自己重读而不是什么都不读......这就是客户端。
fd=fopen(argv[3],"r");
if(fd==NULL){
exit(100);
}
char *line=NULL;
size_t len=0;
ssize_t read;
int byte;
while ((read = getline(&line, &len, fd)) != -1) {
printf("%s\n",line);
pipe_r = open(pipe_r_n, O_WRONLY);
if(pipe_r==-1){
exit(100);
}
byte=strlen(line);
byte;
write(pipe_r,&byte,sizeof(int));
write(pipe_r,line,sizeof(char)*(strlen(line)));
close(pipe_r);
if(strcmp(line,"EXIT\n")==0){
break;
}
}
正如@Michael Dorgan所指出的,你需要在其中加入 opts[byte] = '\0'
读取字符串后,你的malloced区域的最后一个字节总是未初始化的(可能是任何剩余的值)。
你malloced区域的最后一个字节总是未初始化的(可能是任何剩余值)。而且由于你有频繁的malloc和free行为。很可能你的堆内存中喷出了非零字符。因此,当你调用 printf
,你从之前的循环运行中泄露了字符串。