将 shell 命令输出重定向到 C 程序
redirecting shell command output to C program
我有以下程序:
/* a.c */
#include <stdio.h>
int
main(int argc, char* argv[]){
size_t size=0;
char* lineptr;
while(getline(&lineptr, &size, stdin)){
fprintf(stderr, "line = %s\n", lineptr);
if(lineptr){
free(lineptr);
lineptr = NULL;
}
}
return 0;
}
我使用
将 shell 命令 "ls" 的输出重定向到该程序
下一行:
ls | ./a.out
预期输出:
程序应该打印当前目录中所有文件的名称
并终止。
实际输出:
程序打印所有文件名但不终止,
相反,它无限循环并无限打印最后一个条目。
谢谢
GNU 的 getline
函数 returns -1
在文件结束(或错误)时。使用
while(-1 != getline(&lineptr, &size, stdin))
...并在第一次调用 getline
之前将 lineptr
设置为 NULL
。
此外,您不必 free
循环的每次迭代中的指针;您可以重复使用之前的指针和 free
最后一次:
size_t size = 0;
char* lineptr = NULL;
while(-1 != getline(&lineptr, &size, stdin)){
fprintf(stderr, "line = %s", lineptr);
}
free(lineptr);
getline
将根据需要在内部使用 realloc
。请注意,您必须确保 lineptr
和 size
在对 getline
的调用之间没有更改才能使它起作用(尽管您可以更改 lineptr
指向的字符串) .
我有以下程序:
/* a.c */
#include <stdio.h>
int
main(int argc, char* argv[]){
size_t size=0;
char* lineptr;
while(getline(&lineptr, &size, stdin)){
fprintf(stderr, "line = %s\n", lineptr);
if(lineptr){
free(lineptr);
lineptr = NULL;
}
}
return 0;
}
我使用
将 shell 命令 "ls" 的输出重定向到该程序
下一行:
ls | ./a.out
预期输出:
程序应该打印当前目录中所有文件的名称
并终止。
实际输出:
程序打印所有文件名但不终止,
相反,它无限循环并无限打印最后一个条目。
谢谢
GNU 的 getline
函数 returns -1
在文件结束(或错误)时。使用
while(-1 != getline(&lineptr, &size, stdin))
...并在第一次调用 getline
之前将 lineptr
设置为 NULL
。
此外,您不必 free
循环的每次迭代中的指针;您可以重复使用之前的指针和 free
最后一次:
size_t size = 0;
char* lineptr = NULL;
while(-1 != getline(&lineptr, &size, stdin)){
fprintf(stderr, "line = %s", lineptr);
}
free(lineptr);
getline
将根据需要在内部使用 realloc
。请注意,您必须确保 lineptr
和 size
在对 getline
的调用之间没有更改才能使它起作用(尽管您可以更改 lineptr
指向的字符串) .