首页 > 其他 > 详细

20165220 mybash

时间:2018-11-26 01:20:17      阅读:217      评论:0      收藏:0      [点我收藏+]
使用fork,exec,wait实现mybash
- 写出伪代码,产品代码和测试代码
- 发表知识理解,实现过程和问题解决的博客(包含代码托管链接)

1、fork

技术分享图片

功能:创建一个新的进程

一个现存进程调用fork函数是linux内核创建一个新进程的唯一方法(交换进程、init进程和页精灵进程并不是这样,这些进程是由内核作为自举过程的一部分以特殊方式创建的)。

参数:pid_t fork(void);
返回值:一个是子进程返回0,第二个是父进程的返回值大于0.错误返回-1.
头文件:include<unistd.h>

2、exec

技术分享图片

技术分享图片

功能:在用fork函数创建子进程后,子进程往往要调用一个exec函数以执行另一个程序

当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程I D并未改变。exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。

返回值:成功了没返回值,失败了返回-1.
头文件:

#include<unistd.h>

3、wait

技术分享图片

功能:等待进程
参数:pid_t wait(int*status);返回值:调用成功,返回子进程的PID,发生错误返回-1。错误原因放在全局变量errno中
头文件:
#include<sys/types.h>

#include<sys/wait.h>

waitpid
函数说明:在一个子进程结束之前,wait使其调用者阻塞,waitpid使用WNOHANG参数以非阻塞方式等待子进程,waitpid可以指定所需要等待的子进程。

二、实现bash

 

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>

void main()
{
        
    char *command[3];
    command[0] = "ls";
    command[1] = "-l";
    command[2] = 0;
        
        int s,i=0;
        int rtn; 
        printf( ">" );
    //printf("%s %s %s",command[1],command[2],command[3]);  
    printf("%s",command[0]);
    i=0;    
    s=fork();
    if ( s== 0 ) {
    //printf("%d\n",s);
    execvp( command[0], command );
    
    //perror( command );
    
    exit( errno );
     }
     else {
    
    //printf("%d\n",s);

    wait ( &rtn );
    
    printf( " child process return %d\n", rtn );
    
    }
    }

 

实验结果

技术分享图片

 

 

20165220 mybash

原文:https://www.cnblogs.com/brs6666/p/10018186.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!