Mybash实现

Mybash实现

知识储备:

  • feof是C语言标准库函数,其原型在stdio.h中,其功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()清除。

  • 创建进程时经常会用到进程号的类型定义:pid_t。我们都知道这个类型定义实际上就是int型。

  • pid 是控制系统中的重要参数,指控制方式,

  • 我们编写1个普通的c程序, 运行这个程序直到程序结束, 系统只会分配1个pid给这个程序, 也就就说, 系统里只会有一条关于这个程序的进程.

但是执行了fork() 这个函数就不同了.

    fork 这个英文单词在英文里是"分叉"意思,  fork() 这个函数作用也很符合这个意思.  它的作用是复制当前进程(包括进程在内存里的堆栈数据)为1个新的镜像. 然后这个新的镜像和旧的进程同时执行下去. 相当于本来1个进程, 遇到fork() 函数后就分叉成两个进程同时执行了. 而且这两个进程是互不影响

eg:

int main(){  
    printf("it's the main process step 1!!\n\n");  
  
    fork();  
  
    printf("step2 after fork() 1!!\n\n");  
   fork();  
  
    printf("step2 after fork() 2!!\n\n");  
  
  
    int i; scanf("%d",&i);   //prevent exiting  
    return 0;  
}
  • 从执行此程序可以看出来系统到底什么顺序执行主程序和子程序的
int main(){  
    int childpid;  
    int i;  
  
    if (fork() == 0){  
        //child process  
        for (i=1; i<=8; i++){  
            printf("This is child process\n");  
        }  
    }else{  
        //parent process  
        for(i=1; i<=8; i++){  
            printf("This is parent process\n");  
        }  
    }  
  
    printf("step2 after fork() !!\n\n");  
}


uploading-image-523862.png

  • 可以看出它们并不是规则交替输出的, 因为它们两条进程是互相平行影响的,谁快输入谁,每次结果可能不同。
    使用wait() 函数主程序等子程序执行完成(退出)后再执行

  • EXEC,函数族,顾名思义,就是一簇函数,他把当前进程映像替换成新的程序文件,而且该程序通常main函数开始执行。

    • EXEC的命名是有规律的:
  •    exec[l or v][p][e]
    
  •    exec函数里的参数可以分成3个部分,      执行文件部分,     命令参数部分,   环境变量部分.
      例如我要执行1个命令   ls -l /home/gateman  
     执行文件部分就是  "/usr/bin/ls"
     命令参赛部分就是 "ls","-l","/home/gateman",NULL              见到是以ls开头 每1个空格都必须分开成2个部分, 而且以NULL结尾的啊.
      环境变量部分, 这是1个数组,最后的元素必须是NULL 例如  char * env[] = {"PATH=/home/gateman", "USER=lei", "STATUS=testing", NULL};
    
  • 命名规则:
      e后续,  参数必须带环境变量部分,   环境变零部分参数会成为执行exec函数期间的环境变量, 比较少用
      l 后续,   命令参数部分必须以"," 相隔, 最后1个命令参数必须是NULL
       v 后续,   命令参数部分必须是1个以NULL结尾的字符串指针数组的头部指针.         例如char * pstr就是1个字符串的指针, char * pstr[] 就是数组了, 分别指向各个字符串.
      p后续,   执行文件部分可以不带路径, exec函数会在$PATH中找
    

好了,接下来是产品代码:产品代码部分已经上传至码云:

  • 运行结果:

代码托管

参考博客: linux c语言 fork() 和 exec 函数的简介和用法

posted @ 2017-10-23 00:21  20155202张旭  阅读(645)  评论(3编辑  收藏  举报