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.
时间: 2024-12-08 22:00:47

myshell.c的相关文章

在Linux下利用替换函数(exec函数家族)写一个简单的myshell

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h> #include <unistd.h> void swap(char **p,char **q) { char *tmp=*p; *p=*q; *q=tmp; } int main(int argc,char *argv[]) { pid_t id; while(1){ printf(&

myshell

要求 利用fork,exec,wait编写一个具有执行命令功能的shell 原文地址:https://www.cnblogs.com/lsqz/p/11804067.html

whatweb tree

. ├── 1.txt ├── addons │   ├── country-scanner │   ├── gggooglescan │   ├── hunter │   └── verify-nikto ├── CHANGELOG ├── INSTALL ├── lib │   ├── colour.rb │   ├── extend-http.rb │   ├── output.rb │   ├── plugins.rb │   ├── target.rb │   ├── tld.rb │

for

for 变量 in 值1 值2 ...值n do 代码 done #!/bin/bash sum=0 for num in 1 2 3 4 5 注释:可以把in后的数字用[email protected]代替,接收从键盘输入 do sum=$((sum+num)) done echo "sum=$sum" #!/bin/bash #批量解压缩 cd 目录 ls *.tar.gz>tmp.txt for i in $(cat tmp.txt) do tar -xzf $i &

shell 学习笔记整理(二)

特殊字符:    #! 开始的标志    ;  多个命令一起连用的分隔符    [[email protected] log]# echo a;echo b;echo c    a    b    c    .  多种作用:        1. 相当与 source 命令        2. 作为文件名称的一部分(隐藏文件名)  (使用ls -a  可以查看linux下面的隐藏文件)        3.如果作为目录名的话,一个单独的点代表当前工作目录,两个点代表上一级目录.           

shell编程基础

for c in a b c d e f g;do echo $c; done 按顺序输出 for c in a b c d e f g;do tar czvf install.log.$c.tar.gz install.log ; done for c in {a..g}; do echo $c; done 和上面的一样 seq 1 10 列数字的 for i in {1..10}; do echo $i; done 字符串变量实例str='I love linux. I love unix

Java基础——工厂模式

通过学习,一句话概括Java工厂模式的特点--通过建立一个工厂来创建对象,不必关心构造对象实例能不能被实例化啊等诸多细节和复杂过程. 工厂模式呢?就像我们从劳动密集型社会转型到技术密集型社会.打个比方,从前要制造一个桌子,从上山选木头.砍木头.运木头,到设计桌子,制造桌子等细节问题都需要一个人去做好,由于付出的劳动成本极高和技术学成的时间等问题,一般一个木匠在创新方面有一定的局限性.后来,人们步入了工业时代,制造业的发展突飞猛进,另外,倡导分工细化.比如,电脑的制造厂商,它懂得怎样装好一部电脑和

CRLF line terminators导致shell脚本报错:command not found

Linux和Windows文本文件的行结束标志不同.在Linux中,文本文件用"/n"表示回车换行,而Windows用"/r/n"表示回车换行.有时候在Windows编写shell脚本时需要注意这个,否则shell脚本会报"No such file or directory"或"command not found line x"之类的错误,如果不知晓前因后果,肯定会被这个折腾得相当郁闷.如下所示test.sh [[email 

osgi实战学习之路:5.生命周期及利用命令、装饰者模式实现基于socket交互Bundle命令demo

生命周期中关键3个类: BundleActivator 入口点,类似main方法 BundleContext Bundle上下文对象,在运行期间,为应用程序提供操作osgi框架的方法 Bundle 代表一个已安装的Bundle 接口说明: BundleActivator: public interface BundleActivator { public void start(BundleContext context) throws Exception; public void stop(Bu