文章目录

  • 编程思路
  • 代码段
  • 结果展示

编程思路

1.创建一个子进程
2.子进程的代码段来运行shell命令


代码段

头文件

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>
#include <string.h>
#include <sys/wait.h>
#include <stdlib.h>

获取用户名函数

//获取当前用户
void getUser()
{//获取当前用户名struct passwd *pwd = getpwuid(getuid());char buf[50] = {0};getcwd(buf,50);//获取当前路径if(0 == strcmp(pwd->pw_name,"root")){printf("%s@ubuntu:%s# ",pwd->pw_name,buf);      }else{printf("%s@ubuntu:%s$ ",pwd->pw_name,buf);}
}

对录入的命令进行分割

//对录入的命令进行分割
void spCommand(char *argv[10], char *str)
{   //录入的命令进行分割int i = 0;//strtok分割函数 第一次调用必须给第一个参数赋str字符串argv[i++] = strtok(str," ");do{//后续调用设置NULL即可argv[i++] = strtok(NULL," ");}while(argv[i-1] != NULL);
}

main函数

int main()
{while(1){  int ret;pid_t pid = fork();if(pid < 0){perror("fork error!\n");return -1;}else if(0 == pid ){//子进程sleep(1);while(1){getUser();char str[50] = {0};//获取命令参数char *argv[10];//用fgets的原因是能控制录入的字符个数//scanf会遇到空格结束字符录入fgets(str,50,stdin);//fgets会把\n录入,所以为了防止分割字符会单独分割一个字符串"\n"//例如:ls -l\n 分割为 ls -l \n//则execvp第二个参数指针数组是ls -l \n NULL,命令执行出错//要求ls -l NULL 才可运行成功str[strlen(str)-1] = '\0';    //  若录入字符为空或者"\n"重新进入命令行if(strlen(str) == 0){continue;}spCommand(argv,str);ret = execvp(argv[0],argv);//一个命令执行成功进程会自动退出//命令底层代码有退出进程的函数if(-1 == ret){//执行失败会报错,所以会一直循环命令行perror("exec error:");}}}else{//父进程printf("shell 已启动!\n");int status;ret = waitpid(-1,&status,0);if(ret > 0){if(WIFEXITED(status)){printf("子进程返回值为:%d,正常结束!\n",WEXITSTATUS(status));}else if(WIFSIGNALED(status)){printf("子进程返回值为:%d,接受信号结束进程!\n",WTERMSIG(status));}}}}return 0;
}

结果展示

shell 已启动!
linux@ubuntu:/home/linux/c_2022/process/day1$ ls
a.out  fork1.c  fork2.c  fork3.c  shell1.c  shell.c
子进程返回值为:0,正常结束!
shell 已启动!
linux@ubuntu:/home/linux/c_2022/process/day1$ ls -l
总用量 36
-rwxrwxr-x 1 linux linux 13128 8月  27 20:49 a.out
-rw-rw-r-- 1 linux linux   186 8月  26 00:25 fork1.c
-rw-rw-r-- 1 linux linux   186 8月  26 00:23 fork2.c
-rw-rw-r-- 1 linux linux   635 8月  26 03:16 fork3.c
-rw-rw-r-- 1 linux linux  2252 8月  27 20:45 shell1.c
-rw-rw-r-- 1 linux linux  2078 8月  27 20:44 shell.c
子进程返回值为:0,正常结束!
shell 已启动!
linux@ubuntu:/home/linux/c_2022/process/day1$ q
exec error:: No such file or directory
linux@ubuntu:/home/linux/c_2022/process/day1$

用C语言实现shell相关推荐

  1. shell是什么语言?shell 语言的本质

    2019独角兽企业重金招聘Python工程师标准>>> shell是什么语言?shell 语言的本质 "Shell是Linux/Unix的一个外壳,你理解成衣服也行.它负责 ...

  2. c语言加密shell脚本,shell脚本加密

    如何保护自己编写的shell程序 要保护自己编写的shell脚本程序,方法有很多,最简单的方法有两种:1.加密 2.设定过期时间,下面以shc工具为例说明: 一.下载安装shc工具 shc是一个加密s ...

  3. 什么是脚本语言,shell脚本又是什么?

    脚本语言就是解释型语言: 脚本语言(Script language,scripting language,scripting programming language)是为了缩短传统的编写-编译-链接 ...

  4. 一天学会shell语言,shell教程,shell简单入门,shell中文文档

        shell语言是一门linux系统下的工具语言,主要用于写一些linux系统下的操作命令,实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核.或者直接理解为shell命 ...

  5. c语言调用shell脚本或命令

    1.system(执行shell 命令) 相关函数 fork,execve,waitpid,popen 表头文件 #include<stdlib.h> 定义函数 int system(co ...

  6. c语言调用shell命令一 popen使用以及获取命令返回值

    产品升级,新增网卡,原先的产品是arm平台,新网卡是mips平台,需要开发网卡的配置程序,该程序原计划是以守护进程的形式后台执行,不过测试过程中发现系统不是特别稳定,导致程序时不时奔溃下,一时半会儿无 ...

  7. [shell]C语言调用shell脚本接口

    1) system(shell命令或shell脚本路径); 执行过程:system()会调用fork()产生子进程,由子进程来调用/bin/sh -c string来执行参数string字符串所代表的 ...

  8. linux下如何用c语言调用shell命令-转

    C程序调用shell脚本共有三种法子 :system().popen().exec系列函数 system()不用你自己去产生进程,它已经封装了,直接加入自己的命令exec 需要你自己 fork 进程, ...

  9. html怎么shell脚本语言,简单shell脚本例子

    为什么要使用Shell脚本 使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象.缺点是:它们的效率通常不如编译型语言.不过权衡之下,通常使用脚本编程还是值 ...

  10. C语言实现shell

    涉及到的相关函数 获取用户名 : uid_t getuid(void); struct passwd *getpwuid(uid_t uid); //getpwuid 返回一个结构体指针,可以用来获取 ...

最新文章

  1. mysql 密码清楚_mysql 密码清除
  2. 石大ACM2587解题报告
  3. GdiPlus[21]: IGPPathGradientBrush 之 InterpolationColors
  4. linux 服务器安装mysql5.6
  5. python降维效果图_python实现拉普拉斯特征图降维示例
  6. 【剑指offer】_12 数组中的逆序对
  7. hdu 3074 线段树 OR 树状数组
  8. 35-46集 中心极限定理、置信区间
  9. OJ1008: 美元和人民币
  10. 基础知识—表达式与语句-运算符
  11. 在java中关于封装性的说法中错误的是_java题库2
  12. 解决vmrc的连接已断开,正在尝试重新连接
  13. Loadrunner11安装
  14. android stub,Android:ViewStub
  15. 用VBA制作Excel单选框和多选框
  16. am3352偶发上电不启动问题分析
  17. mcs-51单片机CPU的内部结构及工作原理
  18. 提取网页内容-Python
  19. 台式计算机mac地址查询,计算机mac地址查询
  20. 游戏模型制作的注意事项 项目模型规范总结

热门文章

  1. python批量下载网页图片,不用再复制粘贴了(7)
  2. 软件测试人员如何安稳度过企业试用期
  3. 菜鸟的springboot项目图片上传及图片路径分析
  4. C语言练习:该存多少钱
  5. 老派道场普陀山 海天佛国的禅修氛围
  6. 支持向量机 二 :非线性支持向量机
  7. JAVA中文本字符反写
  8. Ubuntu18.04通过apt安装libssl1.1因依赖问题导致失败的解决办法
  9. 从dom4j到JAXB
  10. git push时候出现错误:unable to access‘xxx‘:the requested url returned error