将 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。请注意,您必须确保 lineptrsize 在对 getline 的调用之间没有更改才能使它起作用(尽管您可以更改 lineptr 指向的字符串) .