我正在尝试编写测试,该测试应该从文件描述符中读取一些数据,因此我正在使用dup和pipe函数进行检查。
int main()
{
char *line;
int out;
int p[2];
char *str;
int len = 50;
str = (char *)malloc(235436);
for (int i = 0; i < 235436; ++i)
{
str[i]='h';
}
out = dup(1);
pipe(p);
dup2(p[1], 1);
write(1, str, strlen(str)); //freezes there. malloc alocates memory, i've checked this with debuger
close(p[1]);
dup2(out, 1);
get_next_line(p[0], &line);
}
由于某种原因,尽管这些代码都可以正常工作,但它们仍能完美地工作。
str = (char *)malloc(1000 * 1000);
*str = '\0';
while (len--)
strcat(str, "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur in leo dignissim, gravida leo id, imperdiet urna. Aliquam magna nunc, maximus quis eleifend et, scelerisque non dolor. Suspendisse augue augue, tempus");
out = dup(1);
pipe(p);
dup2(p[1], 1);
if (str)
write(1, str, strlen(str));
close(p[1]);
dup2(out, 1);
get_next_line(p[0], &line);
答案 0 :(得分:2)
(假设您解决了strlen
问题-即write(1, str, 235436)
)
您正在写入管道。未读取该管道。因此write
将被阻止。
从管道中读取一些内容。
答案 1 :(得分:0)
问题出在调用strlen函数!
strlen(str)
因为您没有在字符串的末尾设置终止符。
在初始化循环后添加以下代码将解决该问题:
str[235435]='\0';
答案 2 :(得分:0)
典型的strlen
实现:
size_t strlen(char *s)
{
size_t len = 0;
while(*s++) len++;
return len;
}
换句话说,它通过增加指向字符串开头的指针直到到达空终止符来确定字符串的长度。由于您的缓冲区只是一个字符'h'
的一个块,没有空终止符,因此在其上调用strlen
具有不确定的行为。
您的第二个代码示例中,您在调用malloc
之后显式添加一个空终止符,然后使用strcat
重复写入该字符串不会出现此问题,因为字符串文字会自动为null-终止。
此外,don't cast the result of malloc除非您还需要代码与C ++兼容。
答案 3 :(得分:0)
I'm using pipe on linux machine. Acording to this answer i'm trying to read more bytes, than pipe can contain. So, in this situation i need to create file an operate with it.
FILE *fptr;
fptr = fopen("buffer", "rb+");
if(fptr == NULL) //if file does not exist, create it
{
fptr = fopen("buffer", "wb");
}