从标准输入读取命令并执行:

#include <apue.h>

#include <unistd.h>

#include <sys/wait.h>

int main(int argc, char ** argv)

{

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;      // replace newline with NULL

if ((pid = fork()) < 0) {

err_sys("fork error\n");

} else if (pid == 0) {            // child, 子进程从这里执行

execlp(buf, buf, (char*)0);

err_ret("could not execute : %s\n", buf);

exit(127);

}

// parent, 父进程从这里执行

if ((pid = waitpid(pid, &status, 0)) < 0)

err_sys("waitpid error.\n");

printf("%% ");

}

return 0;

}

因为上面的gfets函数读入命令到buf时,缓冲区最后一个字符为’\n’,所以读入后,要把’\n’置换为NULL。

Unix通过fork函数创建一个新的进程,函数原型为:

pid_t fork (void);

pid_t为一个整数类型。

fork()的调用,会创建一个新的Unix进程,新进程是原进程的一个复制品,我们称呼原来的进程为父进程,新创建的进程为子进程。fork()调用一次,会得到两次返回。对于父进程,fork()会返回新的子进程的进程ID(非负数);对于子进程,fork()会返回0(分别在父子进程返回)。

fork()函数调用,会将父进程的地址空间完整地复制给子进程,调用后,父子进程各自拥有自己独立的进程空间。后续程序可根据pid_t的返回值,来确定父子进程的程序不同走向。

fork()返回负数,表示创建进程失败。

exec系列函数用于执行一个新的可执行文件。通常是在fork()后的子进程中调用,其作用是,把新的可执行文件加载到内存,来覆盖本进程的原有的进程空间,并跳到新可执行文件的起始位置重新执行。execlp()函数是exec()系列函数组中的一个。

父进程希望等待子进程终止,可以调用waitpid()函数实现。原型为:

pid_t waitpid(pid_t pid,int * status,int options);

pid指出子进程的ID,waitpid可以返回子进程的终止状态(status)。

转载于:https://www.cnblogs.com/gradliang/archive/2013/05/22/3788972.html

笔记1-3: 从标准输入读取命令并执行相关推荐

  1. Linux实战教学笔记12:linux三剑客之sed命令精讲

    第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...

  2. Linux 学习笔记之超详细基础linux命令 Part 3

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...

  3. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)

    C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...

  4. LINUX学习笔记:31个常用LINUX命令和相关解释

    LINUX学习笔记三: 最近在带新同事,是一个刚入行的萌新,对于linux不是很熟悉,问我怎么来学习. 所以今天接着之前的部分,继续分享一些linux学习资料.有需要的点点保存,没有跳过呗.PS:内容 ...

  5. lunix 习题 设计一个程序 cuts,它由标准输入读取数据...

    设计一个程序 cuts,它由标准输入读取数据,获取由第一个参数 n 和第二个参数 m 所限定范围的数据,n 和 m 都是整数,即从输入的字符串中抽取第 n 个字符至第 m 个字符之间的所有字符(包括这 ...

  6. [RedHat学习笔记]总结现学的所有命令(RH033),以及相关概念。

    注:所有的命令都用"[COMMAND]"的形式捕捉,查找相关命令的时候请用[?]的形式查找.方便准确. ====================================== ...

  7. 笔记【Redis数据结构、常用命令、key淘汰及持久化策略】

    文章目录 简要介绍 服务安装 数据结构 通用命令 字符串类型命令 散列类型命令 列表类型命令 集合类型命令 有序集合类型命令 HyperLogLog命令 GeoHash命令(地图坐标) 排序命令 事务 ...

  8. Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理

    Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理 Polyworks的工作任务存储分为工作区和项目两级,通过WORKSPACE命令获取工作任务信息,实现更好的任务管理. 下 ...

  9. Polyworks脚本开发学习笔记(十二)-输出和读取文本文件

    Polyworks脚本开发学习笔记(十二)-输出和读取文本文件 Polyworks作为一个测量工具,将测量的数据方便的导出到文本文件则是一项必须的功能.在DATA_FILE这个命令下提供了很多子命令用 ...

最新文章

  1. Spring中Controller层、Filter层、Interceptor层全局统一异常处理
  2. 厉害了!用 JS 实现人脑和计算机交互
  3. 视频图像不正常的几个表现及解决方法
  4. java 几个线程池的理解
  5. 泛函编程(16)-泛函状态-Functional State
  6. 设计模式原则之二:开闭原则
  7. Android自定义View控件
  8. LIO-SAM探秘之文章索引
  9. TCP/IP系列概述之体系结构原则
  10. couchbase java 手册_Couchbase之环境搭建与基于Java的测试
  11. 如何使用可提高员工敬业度的绩效管理软件
  12. 【阿里云镜像】更新阿里巴巴开源镜像站镜像——Ubuntu镜像
  13. BEEF的简介与使用
  14. 回撤率 python_最大回撤用python怎么计算
  15. u3d美术制作规范总结
  16. VR学习(Demo)以及在Unity3D上的项目
  17. 概括TTL、RS32、RS485特点及区别
  18. Matlab利用函数句柄实现函数嵌套
  19. Deep Learning for 3D Point Clouds: A Survey - 3D点云的深度学习:一项调查 (IEEE TPAMI 2020)
  20. 【qq机器人】Nonebot2搭建详细教程

热门文章

  1. Redis学习笔记(八)——持久化
  2. Django基础—— 1.WEB框架介绍
  3. Ubuntu下安装Python3.6并在终端输入Python就能显示Python3.6
  4. [Codevs] 1001 舒适的路线
  5. 梯度下降法与牛顿法的比较
  6. VC++ 获取文件属性创建时间、修改时间和访问时间
  7. 自己手写一个Mybatis框架(简化)
  8. spring-MVC源码解读(一)
  9. [Usaco2007 Oct] Super Paintball超级弹珠
  10. LDAP 配置 ldap_bind: Invalid credentials (49)