#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)该程序的限制是不能向所执行命令传递参数。
分享到:
相关推荐
与之相反的,从流中读数据相当于读取指令的标准输出,指令的标准输入和调用 popen() 的进程相同。 在使用 popen() 函数时,需要注意以下几点: * 由于 popen() 函数返回的是一个标准 I/O 流,所以需要使用 fclose...
在命令执行过程中,bash(ksh)执行命令的过程包括:分析命令-变量求值-命令替代(``和$( ))-重定向-通配符展开-确定路径-执行命令。在这个过程中,我们可以使用重定向来改变命令的输入和输出。 最后,需要注意的是,...
(如果输入文件省略,将从标准输入读取) ③ awk 将读入的记录分割成字段,将第 1 个字段放入变量 $1 中,第 2 个字段放入 $2,以此类推。 $0 表示整条记录。字段分隔符使用 shell 环境变量 IFS 或由参数指定。 ④ ...
第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...
AT 指令是一种标准化的命令语言,用于控制和配置移动电话模块。它由一系列的命令组成,每个命令都有其特定的功能和用途。本文将对 AT 指令进行详细的解释和介绍。 一、厂家认证和软件版本查询 AT+CGMI 命令用于...
* 标准输入之控制 * 标准输出之控制 十四、查看系统中的使用者 十五、改变自己的 username 进入其他使用者的帐号,拥有其使用权利。 十六、查看 username 十七、查看目前本地所有工作站的使用者 十八、与某工作...
要想真正理解Linux系统,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统。 不同Linux发行版的命令数量不一样,但Linux发行版本最少的命令也有200多个。这里笔者把比较重要和使用频率最多的命令...
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。 实例: * find /sbin -perm +700 |xargs ls -l ### 5. top 命令 top 命令用于实时显示 process 的动态。使用权限:...
第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...
键盘通常被指定标准的输入文件, 从键盘上输入就意味着从标准输入文件上输入数据。scanf,getchar函数就属于这类输入。 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。 ASCII文件也称为...
第 6 章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第 7 章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串...
第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...
第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...
第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...
第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...
第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...
第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...
第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...
第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 ...