myshell.c
#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.
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。