/*psh1
*带提示符的shell
*/
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <stdlib.h>
#define MAXARGS 20 /*最多MAXARGS个命令行参数 */
#define ARGLEN 100 /*最长命令行字符 */
char *makestring(char *);
int execute(char **); /*声明execute 参数char**类型*/
int main()
{
char *arglist[MAXARGS+1]; /*指向命令行的指针数组*/
int numargs; /*命令行个数*/
char argbuf[ARGLEN];
numargs = 0;
while(numargs < MAXARGS)
{
printf("Arg[%d]?", numargs); /*提示输入*/
if(fgets(argbuf, ARGLEN, stdin) && *argbuf != '\n') /*从标准输入获取参数,仅输入回车时结束*/
arglist[numargs++] = makestring(argbuf); /*参数字符串的地址赋给arglist*/
else{
if(numargs > 0){
arglist[numargs] = NULL; /*加上最后元素NULL*/
execute(arglist); /*执行*/
numargs = 0; /*重置??但是会退出psh1*/
}
}
}
return 0;
}
int execute(char *arglist[])
{
execvp(arglist[0], arglist); /*运行的程序名, 程序行参数组*/
perror("execvp failed"); /*出错退出*/
exit(1);
}
char *makestring(char *buf) /*裁剪命令行,为命令行字符串分配内存*/
{
char *cp;
buf[strlen(buf)-1]='\0'; /*裁剪结束字符为\0*/
cp = (char*)malloc(strlen(buf)+1); /*分配内存*/
if(cp == NULL){
fprintf(stderr, "no memory\n");
exit(1);
}
strcpy(cp, buf); /*复制字符串*/
return cp;
}
《UNIX/LINUX编程实践教程》实例注释chapt8 - psh1
最新推荐文章于 2022-03-10 21:16:26 发布