码迷,mamicode.com
首页 > 系统相关 > 详细

编写一个简易shell命令行

时间:2016-04-08 15:24:39      阅读:789      评论:0      收藏:0      [点我收藏+]

标签:shell

用fork()创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。

进程程序替换:替换数据和代码,执行不同逻辑,一旦替换之后,父,子进程代码,数据独立。

主要是创建进程,让子进程去执行命令。

技术分享


技术分享

主要有6个调度函数,函数名中p表示传文件名(靠环境变量来看是否存在PATH),没p的需把文件路径传过来,要执行一个程序必须先找到它.

带e表示用自定义环境变量,不带e表示从父进程继承而来的环境变量。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
int main(int argc,char* argv[])
{
        pid_t id;
        while(1)
        {
                printf("[lxj/home]$");
                fflush(stdout);
                char cmd_str[1024]={0};
                ssize_t size=read(0,cmd_str,sizeof(cmd_str)-1);
                char cmd[32]={0};
                char* my_argv[32];
                memset(my_argv,0,sizeof(char*)*32);
                int length=strlen(cmd_str)-2;
        //      printf("%s",cmd_str);
                if(size!=-1)
                {
                        int index=0;
                        while (length >= 0)
                       {
                                while (length >= 0&&cmd_str[length]==‘ ‘)
                                {
                                        cmd_str[length--] = 0;
                                }
                                while (length >= 0 && cmd_str[length] != ‘ ‘)
                                        length--;
                                my_argv[index++]=cmd_str+length+1;
                        }
                        my_argv[index]=NULL;
                        int i=0;
                        index--;
                        for(;i<index;++i,--index)
                        {
                                char*  tmp=my_argv[i];
                                my_argv[i]=my_argv[index];
                                my_argv[index]=tmp;
                        }
                        if(strcmp(argv[0],"cd")==0)
                        {
                                chdir(my_argv[1]);
                                continue;
                        }
                }
                id=fork();
                if(id<0)
                        perror("fork");
                else if(id==0){
                        execvp(my_argv[0],my_argv);
                        exit(1);
                }
                else if(id>0){
                        pid_t waitPid=waitpid(id,NULL,0);

                }
        }
        return 0;
}


本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1761714

编写一个简易shell命令行

标签:shell

原文地址:http://10541556.blog.51cto.com/10531556/1761714

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!