免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2132 | 回复: 2
打印 上一主题 下一主题

用for循环迭代连接管道中的命令 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-31 22:13 |只看该作者 |倒序浏览
下面的程序是一个简单的shell,可以处理管道命令,比如:ls -l | cat | wc -l,这个程序是用递归算法实现管道的,感兴趣的不妨把它改成用for循环迭代连接管道中的命令。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <sys/wait.h>

  5. #define MAX_ARGC 16
  6. #define MAX_CMDC 16
  7. struct cmd_t {
  8.     int argc;
  9.     char *argv[MAX_ARGC];

  10.     void exec()
  11.     {
  12.         execvp(argv[0], argv);
  13.         perror("exec");
  14.         exit(0);
  15.     }
  16. };
  17. int cmdc;
  18. cmd_t *cmdv[MAX_CMDC];

  19. void split_cmd(char *line)
  20. {
  21.      cmd_t * cmd = new cmd_t();
  22.      cmdv[cmdc++] = cmd;

  23.      cmd->argc = 0;
  24.      char *save;
  25.      char *arg = strtok_r(line, " \t", &save);
  26.      while (arg) {
  27.          cmd->argv[cmd->argc++] = arg;
  28.          arg = strtok_r(NULL, " \t", &save);
  29.      }
  30.      cmd->argv[cmd->argc] = NULL;
  31. }

  32. void split_pipe(char *line)
  33. {
  34.     char *save;
  35.     char * cmd = strtok_r(line, "|", &save);
  36.     while (cmd) {
  37.         split_cmd(cmd);
  38.         cmd = strtok_r(NULL, "|", &save);
  39.     }
  40. }

  41. void do_pipe(int index)
  42. {
  43.     if (index == cmdc - 1)
  44.         cmdv[index]->exec();
  45.     int fd[2];
  46.     pipe(fd);
  47.     if (fork() == 0) {
  48.         dup2(fd[1], 1);
  49.         close(fd[0]);
  50.         close(fd[1]);
  51.         cmdv[index]->exec();
  52.     }
  53.     dup2(fd[0], 0);
  54.     close(fd[0]);
  55.     close(fd[1]);
  56.     do_pipe(index + 1);
  57. }

  58. void prompt()
  59. {
  60.     char line[80];
  61.     printf("%% ");
  62.     gets(line);
  63.     split_pipe(line);
  64.     do_pipe(0);
  65. }

  66. int main()
  67. {
  68.     for (;;) {
  69.         int pid = fork();
  70.         if (pid == 0) {
  71.             prompt();
  72.             exit(0);
  73.         }
  74.         waitpid(pid, NULL, 0);
  75.     }
  76.     return 0;
  77. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2009-01-01 00:15 |只看该作者
楼主在刷分吗  
还是找人帮你做题啊

[ 本帖最后由 zhuhefang2006 于 2009-1-1 00:16 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-01-01 00:26 |只看该作者
可以啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP