1.5 从标准输入读取命令并执行
来源:互联网 发布:.com表示网络结构 编辑:程序博客网 时间:2024/04/30 11:39
/*从标准输入读取命令并执行*//*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 10int 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;}