思路:?
?
?
所以要寫一個shell,需要循環(huán)以下過程:?
- 獲取命令行
- 解析命令行
- 建立一個子進(jìn)程(fork)
- 替換子進(jìn)程(execvp)
- 父進(jìn)程等待子進(jìn)程退出(wait)
實現(xiàn)代碼:?文章來源:http://www.zghlxwxcb.cn/news/detail-808560.html
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#define MAX_CMD 1024
char command[MAX_CMD];
int do_face()
{
memset(command, 0x00, MAX_CMD);
printf("minishell$ ");
fflush(stdout);
if (scanf("%[^\n]%*c", command) == 0) {
getchar();
return -1;
}
return 0;
}
char **do_parse(char *buff)
{
int argc = 0;
static char *argv[32];
char *ptr = buff;
while(*ptr != '\0') {
if (!isspace(*ptr)) {
argv[argc++] = ptr;
while((!isspace(*ptr)) && (*ptr) != '\0') {
ptr++;
}
}else {
while(isspace(*ptr)) {
*ptr = '\0';
ptr++;
}
}
}
argv[argc] = NULL;
return argv;
}
int do_exec(char *buff)
{
char **argv = {NULL};
int pid = fork();
if (pid == 0) {
argv = do_parse(buff);
if (argv[0] == NULL) {
exit(-1);
}
execvp(argv[0], argv);
}else {
waitpid(pid, NULL, 0);
}
return 0;
}
int main(int argc, char *argv[])
{
while(1) {
if (do_face() < 0)
continue;
do_exec(command);
}
return 0;
}
????????以上就是本文的全部內(nèi)容,如果對你有幫助,歡迎點贊收藏轉(zhuǎn)發(fā)評論!?文章來源地址http://www.zghlxwxcb.cn/news/detail-808560.html
到了這里,關(guān)于Linux編寫簡易shell的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!