生活随笔
收集整理的這篇文章主要介紹了
mybash的实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2018-2019-1 20165226《信息安全系統設計基礎》 bash的實現
目錄
一、學習fork,exec,wait
二、實現bash
一、學習fork,exec,wait
1、fork
//頭文件
#include <unistd.h>
//函數定義
pid_t fork( void );
返回值:子進程中返回0,父進程中返回子進程ID,出錯返回-1函數說明:一個現有進程可以調用fork函數創建一個新進程。由fork創建的新進程被稱為子進程(child process)。fork函數被調用一次但返回兩次。
#include <stdio.h>
#include <unistd.h>
void main()
{int i;printf("hello, %d\n",getpid());i=2;fork();printf("var %d in %d\n", i, getpid());
}
結果:
2、exec
exec家族
只有)int execve(const char *path, char *const argv[], char *const envp[]);是真正意義上的系統調用,其它都是在此基礎上經過包裝的庫函數。
書寫格式:
先定義一個指針數組:char *argv[]={“ls”,”-l”,(char *)0}
用execv調用ls:execv(“/bin/ls”,argv)
如果用execvp
execvp(“ls”,argv) //直接寫ls就可以了
3、wait
#include<sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status)
參數status用來保存被收集進程退出時的一些狀態,它是一個指向int類型的指針。進程一旦調用了wait,就立即阻塞自己,由wait自動分析是否當前進程的某個子進程已經退出,如果讓它找到了這樣一個已經變成僵尸的子進程, wait就會收集這個子進程的信息,并把它徹底銷毀后返回;如果沒有找到這樣一個子進程,wait就會一直阻塞在這里,直到有一個出現為止。
返回目錄
二、實現bash
while(1)
{fgets(命令行輸入);if(內置的shell命令){解釋命令;}else if(可執行文件){新的子進程加載并運行文件;}
}
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>
#define MAX 128void eval(char *cmdline);
int parseline(char *buf, char **argv);
int builtin_command(char **argv);int main()
{char cmdline[MAX];printf("This is 20165226's bash!\n");while(1){printf("> ");fgets(cmdline, MAX, stdin);if(feof(stdin))exit(0);eval(cmdline);}
}void eval(char *cmdline)
{char *argv[MAX];char buf[MAX];int bg;pid_t pid;strcpy(buf,cmdline);bg = parseline(buf,argv);if(argv[0]==NULL)return;if(!builtin_command(argv)){if((pid=fork()) == 0){if(execvp(argv[0],argv) < 0){printf("%s : Command not found.\n",argv[0]);exit(0);}}}if(!bg){int status;if(waitpid(-1,&status,0) < 0)printf("waitfg: waitpid error!");}else{printf("%d %s",pid, cmdline);return;}
}int builtin_command(char **argv)
{if(!strcmp(argv[0], "quit"))exit(0);if(!strcmp(argv[0],"&"))return 1;return 0;
}int parseline(char *buf,char **argv)
{char *delim;int argc;int bg;buf[strlen(buf)-1]=' ';while(*buf && (*buf == ' '))buf++;argc=0;while( (delim = strchr(buf,' '))){argv[argc++] = buf;*delim= '\0';buf = delim + 1;while(*buf && (*buf == ' '))buf++;}argv[argc] = NULL;if(argc == 0)return 1;if((bg=(*argv[argc-1] == '&')) != 0)argv[--argc] = NULL;return bg;
}
ls
ls -a
git --version
返回目錄[]
轉載于:https://www.cnblogs.com/musea/p/10016466.html
總結
以上是生活随笔為你收集整理的mybash的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。