#include <stdio.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#define MAXLINE 4096
int main(void)
{
char buf[MAXLINE];
pid_t pid;
int status;
printf("%% ");
while(fgets(buf,MAXLINE,stdin) != NULL)
{
if(buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = 0;
if((pid = fork()) < 0)
{
printf("fork error\n");
exit(1);
}else if(pid == 0)
{
execlp(buf, buf, (char *)0);
printf("couldn't execute: %s\n", buf);
exit(127);
}
if((pid = waitpid(pid, &status, 0)) < 0)
{
printf("waitpid error\n");
exit(1);
}
printf("%% ");
}
printf("\n");
return 0;
}
函数execlp:
int execlp(const char *file, const char *arg, ...); //从PATH环境变量中查找文件并执行
file : PATH 环境变量所指的目录中符合的文件名。
arg : 执行的命令名。
第二个参数以后的参数当作命令的参数。
最后一个参数必须用空指针做结束。
执行成功则函数不返回,执行失败则直接返回-1.
函数waitpid:
pid_t waitpid(pit_t pid, int *status, int optinos); //等待子进程结束
pid :
pid > 0 :只等待进程ID等于pid的子进程,不管是否已经有其他子进程运行结束退出,只要指定的子进程还没有结束,waitpid()就会一直等下去。
pid = -1 : 等待任何一个子进程退出。
pid = 0 : 等待其组ID等于调用进程的组ID的任一子进程。
pid < -1 :等待其组ID等于pid的绝对值的任一子进程。
status :这里的status是一个整型指针,是该子进程退出时的状态。
options :
WNOHAYG :若由pid指定的子进程没有结束,则waitpid()不阻塞而立即返回,此时的返回值为0.
WUNTRACED : 为了实现某种操作,由pid指定的任一子进程已被暂停,且其状态自暂停依赖还未报告过,则返回其状态
0 :阻塞父进程,等待子进程退出。
正常返回已经结束运行的子进程的进程号。使用选项WNOHAYG且没有子进程退出时返回0。错误返回-1.