当前位置: 首页 > news >正文

简易shell

点击查看代码

/** simple_shell.c* 简易 Shell:支持单条命令及其参数*   - 输入 exit  → Shell 自身退出*   - 输入 stop   → 终止当前正在运行的子进程* 编译:gcc -std=c11 -Wall -Wextra -pedantic simple_shell.c -o simple_shell*/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>/*-------------------- 宏定义 --------------------*/
#define MAX_LINE_LEN 1024   /* 命令行最大长度 */
#define MAX_ARGS      64    /* 参数最大个数 *//*-------------------- 全局变量 ------------------*/
static pid_t g_child_pid = 0;   /* 当前子进程 PID,若无则为 0 *//*-------------------- 工具函数 ------------------*/
static void die(const char *msg)
{perror(msg);exit(EXIT_FAILURE);
}/* 去掉行尾换行符 */
static void trim_newline(char *line)
{char *p = strchr(line, '\n');if (p) *p = '\0';
}/* 解析命令行到 argv 数组,返回参数个数 */
static size_t parse_line(char *line, char *argv[])
{size_t argc = 0;char *token = strtok(line, " ");while (token && argc < MAX_ARGS - 1) {argv[argc++] = token;token = strtok(NULL, " ");}argv[argc] = NULL;return argc;
}/*-------------------- 主函数 --------------------*/
int main(void)
{char line[MAX_LINE_LEN] = {0};char *argv[MAX_ARGS]    = {NULL};pid_t pid               = 0;int status              = 0;for (;;) {/* 提示符 */printf("simple_shell$ ");fflush(stdout);/* 读取一行输入 */if (!fgets(line, sizeof(line), stdin)) {break;          /* EOF (Ctrl-D) */}/* 去掉换行符 */trim_newline(line);/* 空行继续 */if (strlen(line) == 0) {continue;}/* 解析命令行 */size_t argc = parse_line(line, argv);/* 内置命令:exit */if (strcmp(argv[0], "exit") == 0) {break;}/* 内置命令:stop */if (strcmp(argv[0], "stop") == 0) {if (g_child_pid > 0) {(void)kill(g_child_pid, SIGTERM);}continue;}/* 创建子进程执行外部命令 */pid = fork();if (pid < 0) {die("fork");} else if (pid == 0) {/* 子进程 */execvp(argv[0], argv);die("execvp");  /* 仅当 execvp 失败时到达 */} else {/* 父进程记录子进程 PID 并等待其结束 */g_child_pid = pid;waitpid(pid, &status, 0);g_child_pid = 0;   /* 子进程已结束,清零 */}}return 0;
}
http://www.sczhlp.com/news/7370/

相关文章:

  • table control点击新增按钮后,回车也会新增行问题
  • 3-4 ~ 3-5 GPIO输入 - LI,Yi
  • chrome mcp server
  • Helm 动态参数配置模版
  • 8.7 闲话
  • 自定义Chart并部署一个应用
  • P12213 [蓝桥杯 2023 国 Python B] 最长回文前后缀(Manacher)
  • 二分图最大匹配
  • SGX Externals sgx外部组件
  • 全志T527/A527 AIOT LinuxSDK的安装与简介-盈鹏飞嵌入式
  • 智能制造网络质量保障:德承 DX-1200多网口工控机在windows系统下的网络性能测试指南 - Johnny
  • 目录导航
  • 初三文化课生涯回忆
  • 标准/实际扣料分析系统使用帮助
  • Krisp 推出对话轮次转换模型,基于纯音频信号;DeepMind 发布世界模型 Genie 3 ,可保持数分钟一致性丨日报
  • Windows XP/Server 2003帮助中心漏洞全披露与技术防护方案
  • Python - ipaddress模块
  • 金融级 ZooKeeper 来袭:性能提升100%,SLA 99.99%,数据防护升级
  • 13kB JavaScript实现的MOBA游戏网络同步技术
  • 飞书应用平台-Tita 新CRM销售一体化:重塑企业销售与交付全链路管理
  • SM30 维护视图增强 (添加自定义按钮,隐藏按钮)(转)
  • Java变量与常量全解析(包含常量类、interface 与 final 的比较)
  • 【PostgreSQL17】4 复杂查询
  • 机房散记
  • 《深入理解计算机系统》学习笔记
  • 读开源项目成功之道06让项目受欢迎
  • P5244 [USACO19FEB] Mowing Mischief P
  • Solidity学习之代理合约
  • 微积分笔记
  • 求数组中未出现的最小正整数(408-18/力扣41)