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.


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