Linux-Unix/Linux命令支持处理多个文件,代码是如何实现的?

Linux-Unix/Linux命令支持处理多个文件,代码是如何实现的?

想挽留 发布于 2017-07-02 字数 204 浏览 1105 回复 1

比如ls命令,它支持同时处理多个文件。还有,如果Shell这么写,ls -l wol*,那么实际传给ls的参数,也是“ls -l wol.c wol”,那么这个处理多文件的功能在C代码里如何实现呢?
有没有通用的方式?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜柠檬 2017-10-27 1 楼

main函数可以接受程序运行时的参数(argc, argv),因此处理多个文件的过程就是遍历参数,逐个打开文件处理即可。下面以简化的cat命令的C实现为例,cat命令接受多个文件名作为参数,将文件的内容依次输出到stdout。

#include <stdio.h>
#include <stdlib.h>

/* mycat: concatenate file */
int main(int argc, char *argv[]) {
FILE *fp;
void filecopy(FILE *, FILE *);
char *prog = argv[0]; /* program name for errors */

if (argc == 1) { /* no args, copy standard input */
filecopy(stdin, stdout);
} else
while (--argc)
if ((fp = fopen(*++argv, "r")) == NULL) {
fprintf(stderr, "%s: can't open %sn", prog, *argv);
exit(1);
} else {
filecopy(fp, stdout);
fclose(fp);
}
if (ferror(stdout)) {
fprintf(stderr, "%s: error writing stdoutn", prog);
exit(2);
}
exit(0);
}

/* filecopy: copy file ifp to file ofp */
void filecopy(FILE *ifp, FILE *ofp) {
int c;
while ((c = getc(ifp)) != EOF)
putc(c, ofp);
}

以上代码来自"The C Programming Language"。需要注意的是,argc和argv的值总是比实际的参数多1,因为程序运行时argv的第一个值始终是程序的名称。