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;}