国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux小程序: 手寫自己的shell

這篇具有很好參考價值的文章主要介紹了Linux小程序: 手寫自己的shell。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

注意: 本文章只是為了理解shell內(nèi)部的工作原理, 所以并沒有完成shell的所有工作, 只是完成了shell里的一小部分工作文章來源地址http://www.zghlxwxcb.cn/news/detail-845452.html

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

#define LEFT "["
#define RIGHT "]"
#define END "#"
#define SPLIT " "
#define LINE_SIZE 1024
#define ARGV_SIZE 32
#define EXIT_CODE 66
#define PWD_SIZE 100

int lastexit = 0;
int quit = 0;
char pwd[PWD_SIZE];

const char* getusername() {
  return getenv("USER");
}

const char* mygethostname() {
  return getenv("HOSTNAME");
}

void getpwd() {
  getcwd(pwd, PWD_SIZE);
}

void display() {
  getpwd();
  printf(LEFT"%s@%s %s"RIGHT""END" ", getusername(), mygethostname(), pwd);
}

void getinput(char* cline, int size) {
  char* s = fgets(cline, size, stdin);
  assert(s != NULL);
  cline[strlen(cline) - 1] = '\0';
  //printf("%s\n", cline);
}

int split(char* cline, char* argv[]) {
  int i = 0;
  //printf("%s", cline);
  argv[i ++] = strtok(cline, SPLIT);
  while (argv[i ++] = strtok(NULL, SPLIT));
  return i - 1;
}

void normalExe(char* argv[]) {
    extern char** environ;
    pid_t id = fork();
    if (id < 0) {
      perror("fork");
      //continue;
    } else if (id == 0) {
      // child
      execvpe(argv[0], argv, environ);
      exit(EXIT_CODE);
    }
    // father
    int status = 0;
    pid_t ret = waitpid(id, &status, 0);
  //  if (ret > 0) printf("wait success pid: %d\n", ret);
    if (ret > 0) lastexit = WEXITSTATUS(status);
}

int neijian(char* argv[], int argc) {
  if (argc == 2 && strcmp(argv[0], "cd") == 0) {
    chdir(argv[1]);
    getpwd();
    return 1;
  }
  return 0;
}

int main() {
  //int quit = 0;
  char cline[LINE_SIZE];
  char* argv[ARGV_SIZE] = { NULL };
  extern char** environ;
  while (!quit) {
    display();
    getinput(cline, LINE_SIZE);
    int tt = split(cline, argv);
    if (tt == 0) continue;

    //printf("%d\n", tt);
    /*
    int i = 0;
    for (i = 0; argv[i]; ++ i)
      printf("%s ", argv[i]);
    printf("\n");
    */

    // 內(nèi)建命令執(zhí)行
    //內(nèi)建命令本質(zhì)上就是shell內(nèi)部的一個函數(shù)
    
    int n = neijian(argv, tt);
    //printf("%d\n", n); 

    //普通命令執(zhí)行
    if (!n) normalExe(argv);
  }
  return 0;
}

到了這里,關于Linux小程序: 手寫自己的shell的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Linux一學就會——編寫自己的shell

    Linux一學就會——編寫自己的shell

    替換原理 替換函數(shù) 其實有幾種以exec開頭的函數(shù),統(tǒng)稱exec函數(shù): 解釋 exec是函數(shù)替換的開頭,后面跟的都是多加的功能: l :list的簡寫,表示參數(shù)采用列表。 p :path的簡寫,就是自動搜索并添加環(huán)境變量??梢允褂铆h(huán)境變量PATH,無需寫全路徑。 v :vector的簡寫,是可以用參數(shù)

    2024年02月03日
    瀏覽(13)
  • 【Linux運維】shell腳本檢查服務器內(nèi)存和CPU利用率

    在管理服務器時候?qū)懥艘粋€ shell腳本,在服務上實現(xiàn)每天凌晨3點查系統(tǒng)的指定文件夾下的容量大小,如果超過10G就要刪除3天前的內(nèi)容,還要時刻查詢內(nèi)存和cpu利用率,如果超過80%就要提示用戶出現(xiàn)過載 將以上代碼保存為一個.sh文件,然后通過crontab在每天凌晨3點運行即可:

    2024年02月09日
    瀏覽(33)
  • Linux——shell外殼程序

    Linux——shell外殼程序

    Linux嚴格意義上說的是一個操作系統(tǒng),我們稱之為“核心 “ ,但我們一般用戶,不能直接使用核心。 而是通過 核心的“外殼”程序,也就是所謂的shell 。 shell是所有外殼程序的 統(tǒng)稱 平時程序員所用的指令操作和開發(fā)操作都是 在shell外殼之上操作 的 在 Linux中 ,shell外殼指的

    2024年02月07日
    瀏覽(13)
  • 燕山大學Linux實驗shell程序設計

    燕山大學Linux實驗shell程序設計

    本文僅是分享代碼設計思想和對書上代碼解讀僅供參考嚴禁抄襲?。?! 主要是編寫shell代碼部分問題: 注:for i相當于for i in?$* (取全部位置參數(shù))下文存在不在贅述 4.對教材例題4.9?(P108)進行編輯,然后執(zhí)行。 #!/bin/bash echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 shift echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $

    2023年04月09日
    瀏覽(32)
  • 【Linux】進程程序替換 && 做一個簡易的shell

    【Linux】進程程序替換 && 做一個簡易的shell

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 目錄 文章目錄 前言 進程程序替換 替換原理 先看代碼和現(xiàn)象 替換函數(shù) 第一個execl(): 第二個execv(): 第三個execvp(): 第四個execvpe(): 環(huán)境變量 第五個execlp(): 第六個execle(): 函數(shù)解釋 命名理解 在Make

    2024年04月11日
    瀏覽(11)
  • 【Linux】進程控制 — 進程程序替換 + 實現(xiàn)簡易shell

    【Linux】進程控制 — 進程程序替換 + 實現(xiàn)簡易shell

    上一節(jié)我們講了進程終止和進程等待等一系列問題,并做了相應的驗證,本章將繼續(xù)對進程控制進行學習,我們將學習進程程序替換,進行相關驗證,運用系統(tǒng)進程程序替換接口,自己模擬寫一個shell,該shell能夠?qū)崿F(xiàn)執(zhí)行指令,等一系列命令行操作…… 概念引入: 將可執(zhí)行

    2024年02月06日
    瀏覽(15)
  • 【Linux】一個小故事讓你秒懂shell外殼程序

    【Linux】一個小故事讓你秒懂shell外殼程序

    ? 目錄 ??前言 ??shell外殼程序 ??用戶是直接訪問操作系統(tǒng)嗎? ??什么是Shell外殼程序 ??一個小故事加深你對Shell外殼程序的理解 ??如何查看自己的外殼程序 ??總結(jié) ? ?? 前言 今天我將為大家詳細講解shell外殼程序,并且通過一個小故事來幫助大家理解和加深印象,故

    2024年02月12日
    瀏覽(24)
  • Linux之進程控制&&進程終止&&進程等待&&進程的程序替換&&替換函數(shù)&&實現(xiàn)簡易shell

    Linux之進程控制&&進程終止&&進程等待&&進程的程序替換&&替換函數(shù)&&實現(xiàn)簡易shell

    1.1 fork的使用 我們可以使用man指令來查看一下 子進程會復制父進程的PCB,之間代碼共享,數(shù)據(jù)獨有,擁有各自的進程虛擬地址空間。 這里就有一個代碼共享,并且子進程是拷貝了父進程的PCB,雖然他們各自擁有自己的進程虛擬地址空間,數(shù)據(jù)是拷貝過來的,通過頁表映射到

    2024年04月17日
    瀏覽(26)
  • linux篇---使用systemctl start xxx啟動自己的程序|開機啟動|守護進程

    linux篇---使用systemctl start xxx啟動自己的程序|開機啟動|守護進程

    機器:Nvidia Jetson Xavier 系統(tǒng):ubuntu 18.04 最近在使用symfony的console組件,需要執(zhí)行一個后臺的php進程,并且保持后臺進程一直存在。這里我使用的是Systemctl命令。Systemctl是一個系統(tǒng)管理守護進程、工具和庫的集合。后面我就直接把自己的配置貼出來,僅供參考: app.service的內(nèi)容

    2024年02月11日
    瀏覽(23)
  • Java進程ProcessBuilder類的介紹及使用,ProcessBuilder調(diào)用外部程序執(zhí)行shell命令Linux命令

    Java進程ProcessBuilder類的介紹及使用,ProcessBuilder調(diào)用外部程序執(zhí)行shell命令Linux命令

    目錄 ProcessBuilder類的介紹及使用 【前言】 【正文】 --構造方法-- --常用方法-- --使用技巧-- --調(diào)用本地Shell命令,實例-- 【總結(jié)】 【注意】 ????????在做一個項目的時候需要用到運行時動態(tài)執(zhí)行JAVA命令,一開始的思路是運行時生成bat腳本,然后通過Runtime類的exec方法之行

    2024年02月09日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包