编写一个C程序可以实现SHELL命令解释器的功能!!!!!急求

时间:2022-03-02 16:36:59
编写一个C程序可以实现SHELL命令解释器的功能

14 个解决方案

#1


大神们··急求啊·· 编写一个C程序可以实现SHELL命令解释器的功能!!!!!急求

#2


编写一个C程序可以实现SHELL命令解释器的功能!!!!!急求
这是一个大工程纳

#3


就是实现简单的一些指令就可以,例 ls ll ./a.out等等

#4


ls又不是shell的功能。

#5


课程设计吧?
Google搜索 词法分析器语法分析器,有源代码。

#6


我笔记本上有,就是现在上班了,没带笔记本 编写一个C程序可以实现SHELL命令解释器的功能!!!!!急求

#7


引用 3 楼 u010264303 的回复:
就是实现简单的一些指令就可以,例 ls ll ./a.out等等
  

这个已经有源码的。你去搜一下

#8


bash不就是用c写的 编写一个C程序可以实现SHELL命令解释器的功能!!!!!急求

#9


这个很简单啊!

#10


为了你的40分,现编写一个简单的,只限Linux系统下使用


#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct param {
int argc; 
char *argv[36]; 
}; 

void printParam(struct param *tmp)
{
int i = 0; 
while(tmp->argv[i] != NULL) {
printf("%s\n", tmp->argv[i++]); 
}
}

int getParam(struct param *tmp); 
int main(int argc, char *argv[])
{
int ret = 0; 
int tmp = 0; 
int re = 0; 
struct param pa = {0}; 
do {
printf("[root]#"); 
ret = getParam(&pa); 
if(ret == 0) {
continue; 
}
ret = fork(); 
if(0 == ret) {
if(-1 == execvp(pa.argv[0], &(pa.argv[0]))) {
perror("Bad execv>>>:"); 
exit(-1); 
}
} else {
tmp = ret; 
re = waitpid(-1, &ret, 0); 
// printf("start:%d\tstop:%d\n", tmp, re); 
}
} while(1); 
return 0; 
}

int getParam(struct param *tmp)
{
char buff[1024]; 
int num = 0; 
int i = 0; 
int j = 0; 
fgets(buff, sizeof(buff), stdin); 
num = strlen(buff); 
memset(tmp, 0, sizeof(*tmp)); 

tmp->argv[tmp->argc] = malloc(sizeof(char) * 36); 
memset(tmp->argv[tmp->argc], 0, sizeof(char) * 36); 

for(i = 0; i < num && buff[i] != '\0'; ++i) {
while((' ' == buff[i]) || ('\n' == buff[i])) {
if(i == 0 && buff[i] == '\n') {
return 0; 
}
i++, j = -1;   
}
if(-1 == j ) {
tmp->argc++; 
tmp->argv[tmp->argc] = malloc(sizeof(char) * 36); 
memset(tmp->argv[tmp->argc], 0, sizeof(char) * 36); 
j = 0; 
}
tmp->argv[tmp->argc][j++] = buff[i]; 
}
tmp->argv[tmp->argc] = NULL; 

return tmp->argc; 
}

#11


引用 10 楼 zhou19891113 的回复:
为了你的40分,现编写一个简单的,只限Linux系统下使用


#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct param {
int argc; 
char *argv[36]; 
}; 

void printParam(struct param *tmp)
{
int i = 0; 
while(tmp->argv[i] != NULL) {
printf("%s\n", tmp->argv[i++]); 
}
}

int getParam(struct param *tmp); 
int main(int argc, char *argv[])
{
int ret = 0; 
int tmp = 0; 
int re = 0; 
struct param pa = {0}; 
do {
printf("[root]#"); 
ret = getParam(&pa); 
if(ret == 0) {
continue; 
}
ret = fork(); 
if(0 == ret) {
if(-1 == execvp(pa.argv[0], &(pa.argv[0]))) {
perror("Bad execv>>>:"); 
exit(-1); 
}
} else {
tmp = ret; 
re = waitpid(-1, &ret, 0); 
// printf("start:%d\tstop:%d\n", tmp, re); 
}
} while(1); 
return 0; 
}

int getParam(struct param *tmp)
{
char buff[1024]; 
int num = 0; 
int i = 0; 
int j = 0; 
fgets(buff, sizeof(buff), stdin); 
num = strlen(buff); 
memset(tmp, 0, sizeof(*tmp)); 

tmp->argv[tmp->argc] = malloc(sizeof(char) * 36); 
memset(tmp->argv[tmp->argc], 0, sizeof(char) * 36); 

for(i = 0; i < num && buff[i] != '\0'; ++i) {
while((' ' == buff[i]) || ('\n' == buff[i])) {
if(i == 0 && buff[i] == '\n') {
return 0; 
}
i++, j = -1;   
}
if(-1 == j ) {
tmp->argc++; 
tmp->argv[tmp->argc] = malloc(sizeof(char) * 36); 
memset(tmp->argv[tmp->argc], 0, sizeof(char) * 36); 
j = 0; 
}
tmp->argv[tmp->argc][j++] = buff[i]; 
}
tmp->argv[tmp->argc] = NULL; 

return tmp->argc; 
}

大神能讲一下大致思路不?有点看不懂啊。

#12


培训的吧,这个你多跟同学讨论讨论吧,毕竟自己有思路了写起来就简单了。

#13


引用 11 楼 zerotao 的回复:
Quote: 引用 10 楼 zhou19891113 的回复:

为了你的40分,现编写一个简单的,只限Linux系统下使用
大神能讲一下大致思路不?有点看不懂啊。


原理很简单,我在主要流程里加了点注释.


int main(int argc, char *argv[])
{
...
    do {
        printf("[root]#");      

        ret = getParam(&pa);     /* 读取命令行 */
        if(ret == 0) {
            continue; 
        }

        ret = fork(); 
        if(0 == ret) {    /* 创建一个子进程执行命令 */
            if(-1 == execvp(pa.argv[0], &(pa.argv[0]))) {
                perror("Bad execv>>>:"); 
                exit(-1); 
            }
        } else {    /* 父进程中等待子进程执行 */
            tmp = ret;      
            re = waitpid(-1, &ret, 0); 
    //        printf("start:%d\tstop:%d\n", tmp, re); 
        }
    } while(1); 
    return 0; 
}

#14


谢谢···很有用

#1


大神们··急求啊·· 编写一个C程序可以实现SHELL命令解释器的功能!!!!!急求

#2


编写一个C程序可以实现SHELL命令解释器的功能!!!!!急求
这是一个大工程纳

#3


就是实现简单的一些指令就可以,例 ls ll ./a.out等等

#4


ls又不是shell的功能。

#5


课程设计吧?
Google搜索 词法分析器语法分析器,有源代码。

#6


我笔记本上有,就是现在上班了,没带笔记本 编写一个C程序可以实现SHELL命令解释器的功能!!!!!急求

#7


引用 3 楼 u010264303 的回复:
就是实现简单的一些指令就可以,例 ls ll ./a.out等等
  

这个已经有源码的。你去搜一下

#8


bash不就是用c写的 编写一个C程序可以实现SHELL命令解释器的功能!!!!!急求

#9


这个很简单啊!

#10


为了你的40分,现编写一个简单的,只限Linux系统下使用


#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct param {
int argc; 
char *argv[36]; 
}; 

void printParam(struct param *tmp)
{
int i = 0; 
while(tmp->argv[i] != NULL) {
printf("%s\n", tmp->argv[i++]); 
}
}

int getParam(struct param *tmp); 
int main(int argc, char *argv[])
{
int ret = 0; 
int tmp = 0; 
int re = 0; 
struct param pa = {0}; 
do {
printf("[root]#"); 
ret = getParam(&pa); 
if(ret == 0) {
continue; 
}
ret = fork(); 
if(0 == ret) {
if(-1 == execvp(pa.argv[0], &(pa.argv[0]))) {
perror("Bad execv>>>:"); 
exit(-1); 
}
} else {
tmp = ret; 
re = waitpid(-1, &ret, 0); 
// printf("start:%d\tstop:%d\n", tmp, re); 
}
} while(1); 
return 0; 
}

int getParam(struct param *tmp)
{
char buff[1024]; 
int num = 0; 
int i = 0; 
int j = 0; 
fgets(buff, sizeof(buff), stdin); 
num = strlen(buff); 
memset(tmp, 0, sizeof(*tmp)); 

tmp->argv[tmp->argc] = malloc(sizeof(char) * 36); 
memset(tmp->argv[tmp->argc], 0, sizeof(char) * 36); 

for(i = 0; i < num && buff[i] != '\0'; ++i) {
while((' ' == buff[i]) || ('\n' == buff[i])) {
if(i == 0 && buff[i] == '\n') {
return 0; 
}
i++, j = -1;   
}
if(-1 == j ) {
tmp->argc++; 
tmp->argv[tmp->argc] = malloc(sizeof(char) * 36); 
memset(tmp->argv[tmp->argc], 0, sizeof(char) * 36); 
j = 0; 
}
tmp->argv[tmp->argc][j++] = buff[i]; 
}
tmp->argv[tmp->argc] = NULL; 

return tmp->argc; 
}

#11


引用 10 楼 zhou19891113 的回复:
为了你的40分,现编写一个简单的,只限Linux系统下使用


#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct param {
int argc; 
char *argv[36]; 
}; 

void printParam(struct param *tmp)
{
int i = 0; 
while(tmp->argv[i] != NULL) {
printf("%s\n", tmp->argv[i++]); 
}
}

int getParam(struct param *tmp); 
int main(int argc, char *argv[])
{
int ret = 0; 
int tmp = 0; 
int re = 0; 
struct param pa = {0}; 
do {
printf("[root]#"); 
ret = getParam(&pa); 
if(ret == 0) {
continue; 
}
ret = fork(); 
if(0 == ret) {
if(-1 == execvp(pa.argv[0], &(pa.argv[0]))) {
perror("Bad execv>>>:"); 
exit(-1); 
}
} else {
tmp = ret; 
re = waitpid(-1, &ret, 0); 
// printf("start:%d\tstop:%d\n", tmp, re); 
}
} while(1); 
return 0; 
}

int getParam(struct param *tmp)
{
char buff[1024]; 
int num = 0; 
int i = 0; 
int j = 0; 
fgets(buff, sizeof(buff), stdin); 
num = strlen(buff); 
memset(tmp, 0, sizeof(*tmp)); 

tmp->argv[tmp->argc] = malloc(sizeof(char) * 36); 
memset(tmp->argv[tmp->argc], 0, sizeof(char) * 36); 

for(i = 0; i < num && buff[i] != '\0'; ++i) {
while((' ' == buff[i]) || ('\n' == buff[i])) {
if(i == 0 && buff[i] == '\n') {
return 0; 
}
i++, j = -1;   
}
if(-1 == j ) {
tmp->argc++; 
tmp->argv[tmp->argc] = malloc(sizeof(char) * 36); 
memset(tmp->argv[tmp->argc], 0, sizeof(char) * 36); 
j = 0; 
}
tmp->argv[tmp->argc][j++] = buff[i]; 
}
tmp->argv[tmp->argc] = NULL; 

return tmp->argc; 
}

大神能讲一下大致思路不?有点看不懂啊。

#12


培训的吧,这个你多跟同学讨论讨论吧,毕竟自己有思路了写起来就简单了。

#13


引用 11 楼 zerotao 的回复:
Quote: 引用 10 楼 zhou19891113 的回复:

为了你的40分,现编写一个简单的,只限Linux系统下使用
大神能讲一下大致思路不?有点看不懂啊。


原理很简单,我在主要流程里加了点注释.


int main(int argc, char *argv[])
{
...
    do {
        printf("[root]#");      

        ret = getParam(&pa);     /* 读取命令行 */
        if(ret == 0) {
            continue; 
        }

        ret = fork(); 
        if(0 == ret) {    /* 创建一个子进程执行命令 */
            if(-1 == execvp(pa.argv[0], &(pa.argv[0]))) {
                perror("Bad execv>>>:"); 
                exit(-1); 
            }
        } else {    /* 父进程中等待子进程执行 */
            tmp = ret;      
            re = waitpid(-1, &ret, 0); 
    //        printf("start:%d\tstop:%d\n", tmp, re); 
        }
    } while(1); 
    return 0; 
}

#14


谢谢···很有用