我有一个学校作业,我必须创建一个可以执行以下操作的 shell:
- 读取传入命令,解析命令的每个部分
- 分叉子进程并执行每个命令,而无需 (<>>> |)
- 使用<、>>>成功执行每个命令
- 使用 | 成功执行每个命令
我严重迷路了...我是壳牌的新手,我不知道从这里开始做什么。我的代码给了我一个错误,说明segmentation fault (core dumped)
.任何和所有的帮助将不胜感激。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#define MAX_ARG 10
int main()
{
char line [256];
char prompt[] = "sh2 % ";
char command[256], *args[MAX_ARG];
int pid;
char status;
int i;
/* spit out the prompt */
printf("%s", prompt );
while( fgets(line, sizeof line, stdin) != NULL)
{
/* fgets leaves 'n' in input buffer. ditch it */
line [strlen(line)-1] = ' ';
while (line != NULL)
{
//parse command and arg
args[0] = strtok(line, " "); //grab command
for (i=1; i<MAX_ARG; i++) //grab arguments, to assume max = 10?
{
//if a single command with arguments then set command & argument
//for (i>0)
{
// check to see if the command is 'exit'
if(!strcmp("exit", args[i]))
{
exit(0);
}
{
int p[2];
pipe(p)
if (fork() == 0) //child
{
close (0);
dup(p[0]);
exec("cmd2");
}
else
{
close(1);
close(p[0]);
close(p[1]);
dup(p[1]);
exec("cmd1");
}
close(0);
open("stdout.txt", "r");
if (fork()== 0)
{
exec("cmd3");
}
}
else if (!strcmp(">", args[i]))
open("stderr.txt". "w")
if (fork() == 0)
{
exec("cmd1");
}
}
else if (!strcmp(">>", args[i]))
{
close(1);
open("stdout_stderr.txt", "w");
if (fork() == 0)
{
close(2);
dup(1);
exec("cmd2");
}
}
else
{
pid = fork();
if (pid == 0)
{
status = execvp(command,args);
exit(0);
}
else
{
waitpid(-1);
}
}
}
}
}
}
return 0;
}
你的程序有很多错误,所以很难指出一行并说改变它。 我认为你试图一次做太多,而不是建立在坚实的基础上。
在编程中,你想从小处着手,在你的进步的基础上再接再厉,你的教授帮了你一个忙,把步骤排成一排:
- 读取传入命令,解析命令的每个部分
- 分叉子进程并在没有 (<>>> |) 的情况下执行每个命令
- 成功执行每个命令都带有<、>>>
- 使用 | 成功执行每个命令
尝试让 #1 工作,以便继续使用 #2,正如在使用函数之前提到的,这将有很大帮助。 我建议 http://bytes.com/topic/c/answers/215994-writing-shell-c 看看这篇文章,它将为您提供一个简单的外壳,您可以从中建模。 这是一个基线解析器,可让您开始使用#1(基于提到的帖子)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char line[4096] = {0};
char safeline[4096] = {0};
int done = 0;
int i = 0;
char *s = line;
char **t = NULL;
char *prompt = ">";
char *args = NULL;
char *nl = NULL;
int main(void)
{
while(!done)
{
printf("%s", prompt);
fflush(stdout);
if(NULL == fgets(line, sizeof line, stdin))
{
t = NULL;
done = 1;
}
else
{
nl = strchr(line, 'n');
if(nl != NULL)
{
*nl = ' ';
strcpy(safeline, line);
}
else
{
int ch;
printf("Line too long! Ignored.n");
while((ch = getchar()) != 'n' && ch != EOF)
{
continue;
}
if(ch == EOF)
{
done = 1;
}
}
args = strchr(line, ' ');
if(args != NULL)
{
*args++ = ' ';
}
if(!done)
{
printf("command - %s : args - %sn",s, args);
}
}
}
}