Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7545844
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: LINUX

2011-06-17 21:22:27

  1. /*
  2.  *    vfork创建子进程,调用exec函数
  3.  *    执行键盘输入的命令    //CYGWIN
  4.  *    Lzy    2011-6-13
  5.  */

  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>
  9. #include <string.h>

  10. int main(void)
  11. {
  12.     char buf[10];
  13.     pid_t pid;
  14.     int stat;
  15.     char *p[]={NULL};

  16.     while(1)
  17.     {
  18.         printf("command > ");
  19.         fgets(buf, sizeof(buf), stdin);            //从键盘读

  20.         if(buf[0] == '\n')                        //没输入任何命令
  21.             continue;

  22.         buf[strlen(buf)-1] ='\0';                    //去掉回车符

  23.         if(strcmp(buf,"quit") == 0)                //程序退出
  24.             break;

  25.         pid = vfork();            //创建子进程
  26.         if(pid == 0)            //子进程中
  27.         {
  28.             execvp(buf,p);        //调用exec函数执行输入的命令
  29.         }
  30.         else
  31.         {
  32.             wait(&stat);        //等待子进程结束
  33.         }
  34.     }    

  35.     return 0;
  36. }
  1. /*
  2.  *    模拟shell中管道'|'命令
  3.  *    实现 ls -l | wc -l
  4.  *    Lzy    2011-6-14
  5.  */

  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>

  9. int main(void)
  10. {
  11.     pid_t pid;
  12.     int fd[2];            //匿名管道句柄

  13.     if(pipe(fd) != 0)    //创建匿名管道
  14.     {
  15.         perror("pipe");
  16.         exit(0);
  17.     }
  18.     
  19.     pid = fork();        //创建子进程
  20.     if(pid == 0)        //子进程
  21.     {
  22.         close(fd[0]);        //关闭子进程中管道读端
  23.         dup2(fd[1], 1);        //子进程写管道,复制文件描述符,输出至管道尾
  24.         execlp("ls", "ls", "-l", NULL);        //执行命令 ls -l
  25.     }
  26.     else if(pid > 0)
  27.     {
  28.         close(fd[1]);        //关闭父进程中管道写端
  29.         dup2(fd[0], 0);        //父进程读管道,复制文件描述符,输出至管道头
  30.         execlp("wc", "wc", "-l", NULL);        //执行命令 wc -l
  31.     }

  32.     return 0;
  33. }
阅读(1448) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~