LinuxSir.cn,穿越时空的Linuxsir!

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

[倡议]对自由狼大哥程序的一点评价,并附上一点建议

[复制链接]
发表于 2003-1-19 03:12:45 | 显示全部楼层 |阅读模式
自由狼大哥虽然初学,但很热心。很高兴这里能有这样的人才。

但程序还有很多值得改进的地方:
1. 屏幕控制可以用 curses 库,狼兄用printf 显得非常吃力。
2. 程序的结构有待改进,狼兄基本上是顺序程序,结构化很有限。
3. C 语言的字符处理能力很吃力,或者直接用 shell 来写更加容易。
4. 狼兄编译多个文件用的是脚本,但为什么不用 makefile 代替呢?
5. 程序变量的名字显得有点混乱。
6. 狼兄控制文件,几乎都是字符串处理,然后调用 shell 工具实现,但为什么抛弃linux 的系统调用呢?如果系统调用,那就可以省去这程序90% 的字符串处理。

结论:狼兄的程序虽然比较幼稚(并无贬义,请大家原谅我的率直),但他的热心和公开代码的行为,让我们看到了中国 Linux 未来的希望。


建议:如果狼兄有兴趣,可以把您要实现的功能列出来,让我们大家都来做,公开自己的代码。如果可以,我会第一个做(但不知道能不能第一个做完)。希望大家都来努力,不要让狼兄孤军奋战。
发表于 2003-1-19 04:56:12 | 显示全部楼层
我要跟你抢第一的位置。
自由狼-台风 该用户已被删除
发表于 2003-2-18 16:55:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
自由狼-台风 该用户已被删除
发表于 2003-2-18 17:06:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
自由狼-台风 该用户已被删除
发表于 2003-2-18 17:20:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
自由狼-台风 该用户已被删除
发表于 2003-2-18 17:29:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2003-2-20 10:42:54 | 显示全部楼层
用nftw的tree实现:
有些地方还是不能让人满意,写了一个opendir+readdir+stat的递归实现,原来写过的,今天老是搞不好,昨天晚上没睡觉,估计是头晕的缘故,这个就将就一下吧.

#include <stdio.h>
#include <unistd.h>
#include <libgen.h>
#define __USE_XOPEN_EXTENDED 1
#include <ftw.h>

int printent(const char *, const struct stat *, int, struct FTW *);

int
main(int argc, char *argv[])
{
  if(argc < 2){
    printf("Usage: %s directory\n", argv[0]);
    exit(-1);
  }

  if(nftw(argv[1], printent, 500, FTW_MOUNT | FTW_PHYS) != 0){
    printf("\nnftw error.\n");
    exit(-1);
  }

  exit(0);
}

int
printent(const char *file, const struct stat *st, int flag, struct FTW *s)
{
  char *vline, *name, *f, lk[255];
  int i, fd;

  vline = (char *)malloc(s->level * 2 + 1);
  strcpy(vline, "|");
  for(i = 0; i < s->level - 1; i++)
    strcat(vline, " |");
  strcat(vline, "-");
  f = (char *)malloc(strlen(file) + 1);
  strcpy(f, file);
  name = basename(f);

  if(S_ISREG(st->st_mode))
    printf("%s%s\n", vline, name);
  else if(S_ISCHR(st->st_mode))
    printf("%s%s (Character device)\n", vline, name);
  else if(S_ISBLK(st->st_mode))
    printf("%s%s (Block device)\n", vline, name);
  else if(S_ISFIFO(st->st_mode))
    printf("%s%s (FIFO)\n", vline, name);
  else if(S_ISSOCK(st->st_mode))
    printf("%s%s (SOCKET)\n", vline, name);
  else if(S_ISLNK(st->st_mode)){
    printf("%s%s -> ", vline, name);
    if((i = readlink(file, lk, 255)) == -1)
      perror("error");
    else{
      lk = '\0';
      printf("%s\n", lk);
    }
  }else if(S_ISDIR(st->st_mode))
    printf("%s%s\n", vline, name);

  free(vline);
  free(f);
  return(0);
}
发表于 2003-2-20 10:45:54 | 显示全部楼层
怎么搞的,缩进全没了,论坛这一点能不能改一下,毕竟是linux论坛,源代码常贴.
自由狼-台风 该用户已被删除
发表于 2003-2-26 14:48:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2003-2-26 18:26:51 | 显示全部楼层
可以用popen,下面是一个小例子(少很多东西,如错误检查之类的)

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

int
main(void)
{
  char dir[256], rdir[256];
  char rec[8192];
  FILE *pf;
  int i;

  printf("Enter a directory: ");
  fgets(dir, 255, stdin);
  dir[strlen(dir) - 1] = '\0';
  realpath(dir, rdir);

  sprintf(dir, "ls -al %s", rdir);
  pf = popen(dir, "r");

  i = 0;
  while((rec[i++] = fgetc(pf)) != EOF)
    ;

  write(STDOUT_FILENO, rec, i);
  printf("\n\nend.\n");

  exit(0);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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