LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1014|回复: 9

问问C语言实现命令!!

[复制链接]
发表于 2007-6-18 19:54:09 | 显示全部楼层 |阅读模式
要用C语言实现ls命令。。。。。不知道哪位比较牛的人指点一下。。。。
发表于 2007-6-19 02:04:48 | 显示全部楼层
APUE has the sample code, or just simply
man opendir
回复 支持 反对

使用道具 举报

发表于 2007-6-19 08:53:07 | 显示全部楼层
再补充一下APUE = Advanced Programming in the UNIX Environment
具体参考其第4章21节
回复 支持 反对

使用道具 举报

发表于 2007-6-21 00:27:46 | 显示全部楼层
fgets, fork, execlp
回复 支持 反对

使用道具 举报

发表于 2007-6-27 15:38:16 | 显示全部楼层
如果非要和ls完全一样应该比较困难,可是如果只是简单的想时间列出当前目录的文件(不需要支持ls那些参数,否则你至少要写程序parse参数才行)那要容易多了。
不过估计楼主应该是想实现肯定没有我想的这么简单,不过仍然写在这里了,也许有一点点参考作用也好。最简单的实现是,查找“linux程序设计入门 文件操作”,都会有个例子程序:如果程序参数是一个文件名,输出这个文件的大小和最后修改的时间,如果是一个目录输出这个目录下所有文件的大小和修改时间。把这个程序改改就可以了

哈,还有一个玩笑的答案,一句话就搞定了,system("ls");
回复 支持 反对

使用道具 举报

发表于 2007-6-27 15:55:54 | 显示全部楼层
试了一下,给个最简单的程序(还可能有bug,哈)。这个和ls还是有很大的区别的,比如只能有一个参数,还有仍然会显示一些本该隐藏的文件等等。

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <dirent.h>
  8. #include <time.h>

  9. const char *argDir;

  10. static int get_file_size_time(const char *filename)
  11. {
  12.     struct stat statbuf;
  13.     if(stat(filename,&statbuf)==-1)
  14.     {
  15.         printf("Get stat on %s Error: %s\n", filename,strerror(errno));
  16.         return(-1);
  17.     }
  18.     if(strcmp(filename, argDir) && strcmp(filename, ".") && strcmp(filename, "..") || !S_ISDIR(statbuf.st_mode))
  19.         printf("%s\n", filename);

  20.     if(S_ISDIR(statbuf.st_mode))
  21.         return(1);
  22.     return(0);
  23. }
  24. int main(int argc,char **argv)
  25. {
  26.     DIR *dirp;
  27.     struct dirent *direntp;
  28.     int stats;
  29.     if(argc!=2)
  30.     {
  31.         printf("Usage: %s filename\n\a",argv[0]);
  32.         exit(1);
  33.     }
  34.     argDir = argv[1];
  35.     if(((stats=get_file_size_time(argv[1]))==0)||(stats==-1))exit(1);
  36.     if((dirp=opendir(argv[1]))==NULL)
  37.     {
  38.         printf("Open Directory %s Error: %s\n",
  39.         argv[1],strerror(errno));
  40.         exit(1);
  41.     }
  42.     chdir(argDir);
  43.     while((direntp=readdir(dirp))!=NULL)
  44.         if(get_file_size_time(direntp->d_name)==-1)
  45.             break;
  46.     closedir(dirp);
  47.     exit(1);
  48. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-6-27 18:23:48 | 显示全部楼层
我不懂得用``````````````

三味小说
回复 支持 反对

使用道具 举报

发表于 2007-6-27 18:31:45 | 显示全部楼层
skycleaner为什么贴代码都不用一下[code]块呢?非等宽字并且连缩进都没有的代码很没有吸引力。
回复 支持 反对

使用道具 举报

发表于 2007-6-27 20:27:17 | 显示全部楼层
ls 不是C语言写的吗?

参考一下源代码,然后稍作修改,简化简化应该就可以了
回复 支持 反对

使用道具 举报

发表于 2007-6-28 00:05:57 | 显示全部楼层
to Jockey兄:
哈,别笑话,论坛的功能不怎么会用,虽然也来linuxsir有一段时间了,不过一直没有仔细的看过论坛的规则。而且无论是shell还是c语言都是个newer,[code]怎么使用啊?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表