当前位置: 技术问答>linux和unix
完成一个外壳程序myshell.c,多谢多谢!
来源: 互联网 发布时间:2016-12-03
本文导语: #include #include #include #include main (){ int i; pid_t pid; /* pid of forked child */ char cmdline[128]; /* store the command */ char *args[6]; /* table of pointers to arguments; ...
#include
#include
#include
#include
main (){
int i; pid_t pid; /* pid of forked child */
char cmdline[128]; /* store the command */
char *args[6]; /* table of pointers to arguments;
assume at most 4 arguments */
while(1){
fputs("nmy shell> ", stdout); /* shell prompt */
fgets(cmdline, 128, stdin); /* read command line */
i = 0;
if ( (args[0] = strtok(cmdline, "n t")) == NULL)
continue;
. . .
pid = fork();
if (pid (已完成),之后输入命令,要求能识别命令(可以用strtok()),并用fork()系统呼叫产生出新的子进程。
命令的格式为(中为必选,[]中为可选,中间有空格): .... [&]
2. 子进程(运行中的程序)用exec()系统呼叫去运行一个具体的程序(程序名就是命令名),父进程(外壳程序)在子进程运行其间等待直到子进程结束(用wait()系统呼叫实现),除非是后台运行(命令最后加符号&)
子进程结束后(程序运行结束后)回到显示my shell>
3. 另外需要识别两个内部命令: exit(退出这个外壳程序) 和 cd ...(去别的目录),识别exit用exit()系统呼叫实现,识别cd用chdir()系统呼叫实现。
4. 如果没有输入命令,则退出这个外壳程序。(与输入exit一样)
5. 此外壳程序需要运用的最重要的两个系统呼叫是fork()和execvp(),另外还有一些系统呼叫,如果这些系统呼叫因为无法预料的原因失败,则需要检查其返回状态并报告其错误。
#include
#include
#include
main (){
int i; pid_t pid; /* pid of forked child */
char cmdline[128]; /* store the command */
char *args[6]; /* table of pointers to arguments;
assume at most 4 arguments */
while(1){
fputs("nmy shell> ", stdout); /* shell prompt */
fgets(cmdline, 128, stdin); /* read command line */
i = 0;
if ( (args[0] = strtok(cmdline, "n t")) == NULL)
continue;
. . .
pid = fork();
if (pid (已完成),之后输入命令,要求能识别命令(可以用strtok()),并用fork()系统呼叫产生出新的子进程。
命令的格式为(中为必选,[]中为可选,中间有空格): .... [&]
2. 子进程(运行中的程序)用exec()系统呼叫去运行一个具体的程序(程序名就是命令名),父进程(外壳程序)在子进程运行其间等待直到子进程结束(用wait()系统呼叫实现),除非是后台运行(命令最后加符号&)
子进程结束后(程序运行结束后)回到显示my shell>
3. 另外需要识别两个内部命令: exit(退出这个外壳程序) 和 cd ...(去别的目录),识别exit用exit()系统呼叫实现,识别cd用chdir()系统呼叫实现。
4. 如果没有输入命令,则退出这个外壳程序。(与输入exit一样)
5. 此外壳程序需要运用的最重要的两个系统呼叫是fork()和execvp(),另外还有一些系统呼叫,如果这些系统呼叫因为无法预料的原因失败,则需要检查其返回状态并报告其错误。
|
#include
#include
#include
#include
main (){
int i; pid_t pid; /* pid of forked child */
char cmdline[128]; /* store the command */
char *args[6]; /* table of pointers to arguments;
assume at most 4 arguments */
while(1){
fputs("nmy shell> ", stdout); /* shell prompt */
fgets(cmdline, 128, stdin); /* read command line */
//i = 0;
// if ( (args[0] = strtok(cmdline, "n t")) == NULL)
// continue;
//没有命令直接退出了
if ( (args[0] = strtok(cmdline, "n t")) == NULL)
break;
//解析出其他参数
i = 1;
while ((args[i++] = strtok(NULL, "n t")) != NULL)
;
//exit 命令就直接退出了
if (strcmp(args[0], "exit") == 0) {
exit(0);
}
//cd命令就进入
if (strcmp(args[0], "cd") == 0) {
if (args[1] != NULL) {
chdir(args[1]);
}
else {
printf("command errorn");
continue;
}
}
pid = fork();
if (pid
#include
#include
#include
main (){
int i; pid_t pid; /* pid of forked child */
char cmdline[128]; /* store the command */
char *args[6]; /* table of pointers to arguments;
assume at most 4 arguments */
while(1){
fputs("nmy shell> ", stdout); /* shell prompt */
fgets(cmdline, 128, stdin); /* read command line */
//i = 0;
// if ( (args[0] = strtok(cmdline, "n t")) == NULL)
// continue;
//没有命令直接退出了
if ( (args[0] = strtok(cmdline, "n t")) == NULL)
break;
//解析出其他参数
i = 1;
while ((args[i++] = strtok(NULL, "n t")) != NULL)
;
//exit 命令就直接退出了
if (strcmp(args[0], "exit") == 0) {
exit(0);
}
//cd命令就进入
if (strcmp(args[0], "cd") == 0) {
if (args[1] != NULL) {
chdir(args[1]);
}
else {
printf("command errorn");
continue;
}
}
pid = fork();
if (pid