`

从标准输入读命令并执行

阅读更多
#include "apue.h"
#include <sys/wait.h>

int main(void)
{
 	char buf[MAXLINE];//from apue.h
	pid_t pid;
	int status;
	
	printf("%% ");//print prompt
	while(fgets(buf,MAXLINE,stdin)!=NULL){
		if(buf[strlen(buf)-1]=='\n')
			buf[strlen(buf)-1]=0;//replace newline with null
		if((pid=fork())<0){
			err_sys("fork error");
		}else if(pid==0){
			execlp(buf,buf,(char *)0);
			err_ret("couldn't execute: %s",buf);
			exit(127);
		}

		/*parent*/
		if((pid=waitpid(pid,&status,0))<0)
			err_sys("waitpid error");
		printf("%% ");
	}
	exit(0);
}

 程序讲解:

(1)fgets函数为标准I/O函数,用于从标准输入读入一行,当键入Ctrl+D时,fgets返回一个null指针,于是循环终止,进程也终止。

(2)execlp函数要求参数以null结束,而不是以换行符结束。所以,此程序用标准C函数strlen计算此字符串的长度,然后用一个null字节替换换行符。

(3)调用fork创建一个新进程。新进程是调用进程的复制品,一般称调用进程为父进程,新创建的进程为子进程。fork函数向父进程返回子进程的进程ID(非负),对子进程则返回0.因为fork创建一个进程,所以说它被调用了一次(由父进程),但返回两次(分别在父进程及子进程中)。

(4)在子进程中,调用execlp函数以执行从标准输入读入的命令。这就用新的程序文件替换了子进程原先执行的程序文件。fork和跟随其后的exec两者的组合是某些操作系统所称的产生一个新进程。

(5)子进程调用execlp执行新程序文件,而父进程希望子进程等待子进程终止,这一要求由调用waitpid函数实现,其参数指定要等待的进程(在此程序里为pid)。

(6)该程序的限制是不能向所执行命令传递参数。

分享到:
评论

相关推荐

    Linux下使用popen()执行shell命令.docx

    与之相反的,从流中读数据相当于读取指令的标准输出,指令的标准输入和调用 popen() 的进程相同。 在使用 popen() 函数时,需要注意以下几点: * 由于 popen() 函数返回的是一个标准 I/O 流,所以需要使用 fclose...

    linux下输入输出重定向.docx

    在命令执行过程中,bash(ksh)执行命令的过程包括:分析命令-变量求值-命令替代(``和$( ))-重定向-通配符展开-确定路径-执行命令。在这个过程中,我们可以使用重定向来改变命令的输入和输出。 最后,需要注意的是,...

    Linuxawk命令详解[归类].pdf

    (如果输入文件省略,将从标准输入读取) ③ awk 将读入的记录分割成字段,将第 1 个字段放入变量 $1 中,第 2 个字段放入 $2,以此类推。 $0 表示整条记录。字段分隔符使用 shell 环境变量 IFS 或由参数指定。 ④ ...

    shell编程和unix命令

    第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...

    AT指令

    AT 指令是一种标准化的命令语言,用于控制和配置移动电话模块。它由一系列的命令组成,每个命令都有其特定的功能和用途。本文将对 AT 指令进行详细的解释和介绍。 一、厂家认证和软件版本查询 AT+CGMI 命令用于...

    Unix命令大全.doc

    * 标准输入之控制 * 标准输出之控制 十四、查看系统中的使用者 十五、改变自己的 username 进入其他使用者的帐号,拥有其使用权利。 十六、查看 username 十七、查看目前本地所有工作站的使用者 十八、与某工作...

    入门学习Linux常用必会60个命令实例详解doc/txt

    要想真正理解Linux系统,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统。 不同Linux发行版的命令数量不一样,但Linux发行版本最少的命令也有200多个。这里笔者把比较重要和使用频率最多的命令...

    大厂测试开发工程师面试基础——Linux命令

    xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。 实例: * find /sbin -perm +700 |xargs ls -l ### 5. top 命令 top 命令用于实时显示 process 的动态。使用权限:...

    LINUX与UNIX SHELL编程指南

    第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...

    C语言程序设计标准教程

    键盘通常被指定标准的输入文件, 从键盘上输入就意味着从标准输入文件上输入数据。scanf,getchar函数就属于这类输入。  从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。  ASCII文件也称为...

    LINUX 与 UNIX SHELL编程指南

    第 6 章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第 7 章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串...

    linux shell 编程教程

    第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...

    shell 编程指南pdf

    第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...

    LINUX与UNIX SHELL编程指南(很全)

    第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...

    Linux与Unix Shell编程指南(PDF格式,共30章)

    第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...

    linux与unix shell 编程(下)

    第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...

    LINUX与UNIX SHELL编程指南.rar

    第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...

    Linux与unix shell编程指南1.rar

    第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...

    shell教程-30章,下了之后会让你大吃一惊,相当好

    第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...

Global site tag (gtag.js) - Google Analytics