LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 566|回复: 1

如何写一个简单的shell?ZT

[复制链接]
发表于 2004-4-10 22:10:24 | 显示全部楼层 |阅读模式
我是想利用apue中的命令处理函数(课本的只是处理系统本身的shell命令且不能带参数),对我的从键盘输入命令(带参数的)来执行我的功能函数的。整个程序就是一个简单的shell程序。我想知道怎样来通过对输入命令的分析来调用功能函数。希望大家能给点意见,源程序如下:
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include "ourhdr.h"

static void sig_int(int); /* our signal-catching function */

int
main(void)
{
char buf[MAXLINE];
pid_t pid;
int status;

if (signal(SIGINT, sig_int) == SIG_ERR)
err_sys("signal error");

printf("%% "); /* print prompt (printf requires %% to print %) */
while (fgets(buf, MAXLINE, stdin) != NULL) {
buf[strlen(buf) - 1] = 0; /* replace newline with null */

if ( (pid = fork()) < 0)
err_sys("fork error");

else if (pid == 0) { /* child */
execlp(buf, buf, (char *) 0);
err_ret("couldn't execute: %s", buf);
exit(127);
}

/* parent */
if ( (pid = waitpid(pid, &status, 0)) < 0)
err_sys("waitpid error");
printf("%% ");
}
exit(0);
}

void
sig_int(int signo)
{
printf("interrupt\n%% ");
}
发表于 2004-4-10 22:52:54 | 显示全部楼层

  1. ......
  2.   int i;
  3.   char *myargv[255];
  4. ......
  5.   else if (pid == 0) { /* child */
  6.     i = 0;
  7.     myargv[0] = strtok(buf, " \t");
  8.     while(myargv[i]){
  9.       i++;
  10.       myargv[i] = strtok(NULL, " \t");
  11.     }
  12.     execvp(buf, myargv);
  13.     err_ret("couldn't execute: %s", buf);
  14.     exit(127);
  15.   }
  16. ......
复制代码

可以处理参数,但是不能处理参数中的通配符,数组大小是255,除去0的程序名和最后的NULL,参数最多253个
我原来看到这里也写过一个,比这个好多了,不过我现在找不到代码放到哪里了,郁闷……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表