将shell命令输出重定向到C程序

时间:2015-02-16 18:34:00

标签: c shell io-redirection

我有以下程序:

/* 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命令的输出&#34; ls&#34;使用中的这个程序 以下一行:

ls | ./a.out

预期产量:
程序应该打印当前目录中所有文件的名称
并终止。

实际输出:
程序打印所有文件的名称但不终止,
相反,它无限循环并无限地打印最后一个条目。

谢谢

1 个答案:

答案 0 :(得分:4)

GNU的getline函数在文件结束(或错误)时返回-1。使用

while(-1 != getline(&lineptr, &size, stdin))

...并在第一次调用lineptr之前将NULL设置为getline

此外,在循环的每次迭代中都没有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的调用之间不更改sizegetline才能使其生效(尽管您可以更改lineptr点的字符串)