14 个解决方案
#1
大神们··急求啊··
#2
这是一个大工程纳
#3
就是实现简单的一些指令就可以,例 ls ll ./a.out等等
#4
ls又不是shell的功能。
#5
课程设计吧?
Google搜索 词法分析器, 语法分析器,有源代码。
Google搜索 词法分析器, 语法分析器,有源代码。
#6
我笔记本上有,就是现在上班了,没带笔记本
#7
这个已经有源码的。你去搜一下
#8
bash不就是用c写的
#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
大神能讲一下大致思路不?有点看不懂啊。
#12
培训的吧,这个你多跟同学讨论讨论吧,毕竟自己有思路了写起来就简单了。
#13
原理很简单,我在主要流程里加了点注释.
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
大神们··急求啊··
#2
这是一个大工程纳
#3
就是实现简单的一些指令就可以,例 ls ll ./a.out等等
#4
ls又不是shell的功能。
#5
课程设计吧?
Google搜索 词法分析器, 语法分析器,有源代码。
Google搜索 词法分析器, 语法分析器,有源代码。
#6
我笔记本上有,就是现在上班了,没带笔记本
#7
就是实现简单的一些指令就可以,例 ls ll ./a.out等等
这个已经有源码的。你去搜一下
#8
bash不就是用c写的
#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
为了你的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
大神能讲一下大致思路不?有点看不懂啊。
为了你的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
谢谢···很有用