首页 > 系统服务 > 详细

myshell.c

时间:2015-04-26 19:47:16      阅读:198      评论:0      收藏:0      [点我收藏+]
#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.


myshell.c

原文:http://blog.csdn.net/u011641885/article/details/45290469

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!