/*从标准输入读取命令并执行*/
/*2013年 05月 18日 星期六 21:09:01 HKT*/
#include <stdio.h>
#include <unistd.h> //用于pid_t数据类型, execlp(),waitpid()
#include <stdlib.h> //exit()
#include <string.h> //strlen()
#define MAXLINE 10
int main()
{
char buf[MAXLINE];
int status;//用来保存子程序返回的状态信息
pid_t pid; //用来存放进程的PID
printf("%% ");//打印一个百分比号
while(fgets(buf, MAXLINE, stdin) != NULL)//从标准输入里读取数据保存到buf中,出错返回NULL
{
buf[strlen(buf)-1] = 0;//上面的fgets会读入回车,这里把回车去掉,改为空字符
//因为下面的execlp要以null结束的字符串
if((pid = fork()) < 0)
{
perror("fork()");//当错误时,用perroe打印errno中的错误信息
}
else if(pid == 0) //在新建的子进程中,用子进程调用各种命令
{
execlp(buf, buf, (char *)0);//execlp("ls", "ls", "-al", "/etc", (char *)0),在PATH中查找buf, 之后把第二个buf当作与查找的那个文件(argv[0]);
//上面的exelcp()执行成功时,不会执行后面的语句了,出错时才会执行
printf("不能执行命令: %s\n", buf);
exit(1);//终止子程序
}
if((pid = waitpid(pid, &status, 0)) < 0)//出错返回-1
{//&status保存子进程状态值,最后一个参数参考书本p315,会返回子进程的PID
//这里,让父进程等待子进程结束,再执行waitpid下面的语句,也就是是每创一
//个进程,等到它结束时再创另一个
printf("waitpid()函数出错!\n");
}
printf("%% ");
}
return 0;
}
1.5 从标准输入读取命令并执行
最新推荐文章于 2023-09-08 09:40:19 发布