使用替换致函执行其它文件程序
创建一个mycmd.c文件
修改makefile,方便一次生成俩个文件
这里的all不需要依赖关系,只要依赖方法
我们现在想用exce来执行mycmd
记住这个路径
成功调用了mycmd文件
测试-b命令
程序运行成功
也可把程序里面的路径设置为相对路径(用.或..)
使用替换致函执行其它语言文件
创建俩个文件
测试一下代码
sh文件
也可加上执行权限直接运行
execlp
最终boss:execle
int execle(const char *path,const char *arg,...,char *const envp[]);
path:路径+文件名
arg:命令行模式下使用格式,命令行参数必须以NULL结尾
envp:环境变量
mycmd.c文件
我们使用getenv获取环境变量,getenv根据环境变量名获取环境变量
Come on这个环境变量并不存在,这是我们自己写的
exec.c文件
执行这个文件,注意我们没有给函数传环境变量
我们传一个环境变量
我们发现come on打印成功,这是因为再exec.c文件中父进程把环境变量通过execle传给了子进程,子execle函数调用了mycmd.c文件,mycmd.c通过getenv获取到了环境变量Come on
Shell简单实现
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #define NUM 1024 #define SIZE 32 #define EP " " char cmd_line[NUM];//保存完整的字符串 char* g_garp[SIZE];//保存打散后的字符串 int main() { while (1) { printf("[root@localhost myshell]# "); fflush(stdout); memset(cmd_line, '\0', sizeof cmd_line); if (fgets(cmd_line, sizeof cmd_line, stdin) == NULL) { continue; } cmd_line[strlen(cmd_line) - 1] = '\0'; g_garp[0] = strtok(cmd_line, EP); int index = 1;//作为打散后要保存字符串的下标 if (strcmp(g_garp[0], "ls") == 0) { g_garp[index++] = "--color=auto"; } if (strcmp(g_garp[0], "ll") == 0) { g_garp[0] = "ls"; g_garp[index++] = "-l"; g_garp[index++] = "--color=auto"; } while (g_garp[index++] = strtok(NULL, EP));//分隔字符串,并复制 if (strcmp(g_garp[0], "cd") == 0) { if (g_garp[1] != NULL); chdir(g_garp[1]); continue; } pid_t id = fork(); if (id == 0) { printf("下面子进程要进行的是\n"); execvp(g_garp[0], g_garp); exit(0); } //父进程获取子进程信息 int status = 0; pid_t ret = waitpid(id, &status, 0); if (ret > 0) printf("exit code:%d\n", WEXITSTATUS(status)); } return 0; }
如果这样打印,没有换行,这是因为我们没有刷新缓冲区
这种情况会自动换行,是因为我们按了回车,多了\n,我们把\n改为\0就行
输入cd命令没反应
这里输入cd其实是想让父进程执行自己的命令,这种命令叫内置命令(内建命令)
内建命令本质其实就是shell中的一个函数调用
系统中有一个调用接口chdir,表示更改当前目录
这里chdir(g_garv[1])//表示切换到数组下标为1的这个路径
chdir函数用于改变当前工作目录。调用参数是指向目录的指针