笔记1-3: 从标准输入读取命令并执行
从标准输入读取命令并执行:
#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: 从标准输入读取命令并执行相关推荐
- Linux实战教学笔记12:linux三剑客之sed命令精讲
第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...
- Linux 学习笔记之超详细基础linux命令 Part 3
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...
- C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)
C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...
- LINUX学习笔记:31个常用LINUX命令和相关解释
LINUX学习笔记三: 最近在带新同事,是一个刚入行的萌新,对于linux不是很熟悉,问我怎么来学习. 所以今天接着之前的部分,继续分享一些linux学习资料.有需要的点点保存,没有跳过呗.PS:内容 ...
- lunix 习题 设计一个程序 cuts,它由标准输入读取数据...
设计一个程序 cuts,它由标准输入读取数据,获取由第一个参数 n 和第二个参数 m 所限定范围的数据,n 和 m 都是整数,即从输入的字符串中抽取第 n 个字符至第 m 个字符之间的所有字符(包括这 ...
- [RedHat学习笔记]总结现学的所有命令(RH033),以及相关概念。
注:所有的命令都用"[COMMAND]"的形式捕捉,查找相关命令的时候请用[?]的形式查找.方便准确. ====================================== ...
- 笔记【Redis数据结构、常用命令、key淘汰及持久化策略】
文章目录 简要介绍 服务安装 数据结构 通用命令 字符串类型命令 散列类型命令 列表类型命令 集合类型命令 有序集合类型命令 HyperLogLog命令 GeoHash命令(地图坐标) 排序命令 事务 ...
- Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理
Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理 Polyworks的工作任务存储分为工作区和项目两级,通过WORKSPACE命令获取工作任务信息,实现更好的任务管理. 下 ...
- Polyworks脚本开发学习笔记(十二)-输出和读取文本文件
Polyworks脚本开发学习笔记(十二)-输出和读取文本文件 Polyworks作为一个测量工具,将测量的数据方便的导出到文本文件则是一项必须的功能.在DATA_FILE这个命令下提供了很多子命令用 ...
最新文章
- Spring中Controller层、Filter层、Interceptor层全局统一异常处理
- 厉害了!用 JS 实现人脑和计算机交互
- 视频图像不正常的几个表现及解决方法
- java 几个线程池的理解
- 泛函编程(16)-泛函状态-Functional State
- 设计模式原则之二:开闭原则
- Android自定义View控件
- LIO-SAM探秘之文章索引
- TCP/IP系列概述之体系结构原则
- couchbase java 手册_Couchbase之环境搭建与基于Java的测试
- 如何使用可提高员工敬业度的绩效管理软件
- 【阿里云镜像】更新阿里巴巴开源镜像站镜像——Ubuntu镜像
- BEEF的简介与使用
- 回撤率 python_最大回撤用python怎么计算
- u3d美术制作规范总结
- VR学习(Demo)以及在Unity3D上的项目
- 概括TTL、RS32、RS485特点及区别
- Matlab利用函数句柄实现函数嵌套
- Deep Learning for 3D Point Clouds: A Survey - 3D点云的深度学习:一项调查 (IEEE TPAMI 2020)
- 【qq机器人】Nonebot2搭建详细教程
热门文章
- Redis学习笔记(八)——持久化
- Django基础—— 1.WEB框架介绍
- Ubuntu下安装Python3.6并在终端输入Python就能显示Python3.6
- [Codevs] 1001 舒适的路线
- 梯度下降法与牛顿法的比较
- VC++ 获取文件属性创建时间、修改时间和访问时间
- 自己手写一个Mybatis框架(简化)
- spring-MVC源码解读(一)
- [Usaco2007 Oct] Super Paintball超级弹珠
- LDAP 配置 ldap_bind: Invalid credentials (49)