编写一个简易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;
}
时间: 2024-11-08 12:01:39

编写一个简易shell命令行的相关文章

NodeJS用递归实现异步操作的链式调用,完成一个简易的命令行输入输出REPL交互接口

REPL —— Read-Eval-Print-Loop. 00.一门好的编程语言的必要条件 REPL并不是什么高大上的东西,简单的说就是一个从命令行程序,读取终端输入,处理,打印结果,如此循环.这是一门比较全面的编程语言的基础. 刚开始接触NodeJS,以为就是一个服务端Js,但学习了一段时间之后才感受到它的强大和魅力.如果说Java是编程游戏里一个喜欢循规蹈矩的古板选手,JavaScript就是一个天马行空的飘逸选手.刚开始转型异步编程非常不习惯,慢慢的懂得,异步编程,是一种思维. 01.依

Shell 命令行快捷键

在shell命令终端中,Ctrl+n相当于方向向下的方向键,Ctrl+p相当于方向向上的方向键. 在命令终端中通过它们或者方向键可以实现对历史命令的快速查找.这也是快速输入命令的技巧. 在命令终端中可以通过Ctrl+r 实现快速检索使用过的历史命令.Ctrl+r中r是retrieve中r. Ctrl+a:光标回到命令行首. (a:ahead) Ctrl+e:光标回到命令行尾. (e:end) Ctrl+b:光标向行首移动一个字符. (b:backwards) Ctrl+ f:光标向行尾移动一个字

玩转shell命令行

移动光标快捷键 ctrl+f 向前移动一个字符 ctrl+b 向后移动一个字符 ctrl+a 移动到当前行首home ctrl+e 移动到当前行尾end alt+f 向前移动一个单词 alt+b 向后移动一个单词 ctrl+l 清屏,并在屏幕最上面开始一个新行 编辑命令行快捷键 ctrl+d 删除当前的字符(光标处在一个空白的命令行上,将会退出shell) alt+d 删除从光标到当前单词结尾的部分 ctrl+w 删除从光标到当前单词开始部分 ctrl+k 删除文本直到行的末尾 ctrl+u 删

几种在shell命令行中过滤adb logcat输出的方法

我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adb logcat输出的方法. 1.只显示需要的输出(白名单) 最方便的当然是通过管道使用 grep 过滤了,这样可以使用 grep 强大的正则表达式匹配.简单的匹配一行当中的某个字符串,例如 MyApp: adb logcat | grep MyApp       adb logcat | grep -i

使用jq工具在Shell命令行处理JSON数据

因为最近要处理一些 JSON 数据格式,一大早经过一番搜索后,最终找到了 jq 这个很棒的工具.jq 允许你直接在命令行下对 JSON 进行操作,包括分片.过滤.转换等等. 首先在mac下安装jq,使用brew install jq就可以了,前提是安装了homebrew,如果在linux ubuntu下,应该可以使用sudo apt-get install jq安装. 让我们通过几个例子来说明 jq 的功能: 一.输出格式化,漂亮的打印效果 如果我们用文本编辑器打开 JSON,有时候可能看起来会

* 和 ?在 shell 命令行中与在正则表达式中的区别

Linux 正则表达式 你有没有想过,在 shell 命令行中的 *,?和正则表达式中的*,?是否一样? 自打好多年前接触 DOS,就知道了* 和?这两个通配符(Wildcard),象 dir *.* 这样的命令也不知道敲了多少遍. 后来,开始用 Windows 3.1 这样的图形界面操作系统,命令行就就得越来越少了. 再后来,开始学习正则表达式,又开始接触 * 和 ? 这样的东西.在正则中它们被称为元字符(Meta Character). 再再后来,开始使用 Linux,于是又开始使用命令行,

SylixOS下Shell命令行执行模块内函数

1. 适用范围 本文档介绍了在Shell命令行执行内核模块内函数实现原理.   在VxWorks中,系统自带有在Shell命令行直接执行驱动.应用内函数的功能,此功能完善了驱动开发工程师.应用开发工程师的开发.调试的手段.为了让这类工程师能快速适应SylixOS,据此开发了类似的功能模块,目前第一版支持在Shell命令行执行内核模块内的函数. 2. SylixOS内核模块动态加载原理 2.1 SylixOS中的ELF文件 SylixOS中的ELF文件主要有三种: - obj文件: 一个源文件编译

windows下shell命令行的常用操作命令

windows下shell命令行的常用操作命令 Command Shell是Windows内置的第一个使用批处理(.bat)文件自动执行日常任务,可以在Command Shell中运行更复杂的脚本 进入d盘直接输入 d: 切换目录 cd 显示目录 dir 进入某个文件夹并打开windows窗口 start ./filepath 远程连接ssh 与linux下一样,直接输入用户名@ip,输入密码即可 显示ip ipconfig Net user 功能:查看本机账户情况 net user xxx 1

〖Linux〗上传单个文件到FTP的Shell命令行(函数)

1 #!/bin/bash - 2 #=============================================================================== 3 # 4 # FILE: ftp_put_file.sh 5 # 6 # USAGE: ./ftp_put_file.sh 7 # 8 # DESCRIPTION: 9 # 10 # OPTIONS: --- 11 # REQUIREMENTS: --- 12 # BUGS: --- 13 # NO