exec族】的更多相关文章

昨天学习了Linux下的进程创建,创建一个进程的方法极为简单,只需要调用fork函数就可以创建出一个进程,但是-- 介绍fork()函数的时候提到,在创建进程后,子进程与父进程有相同的代码空间,执行的是和父进程完全一样的代码-- 那这样的话,我辛辛苦苦创建一个进程,还有什么意义? 辛辛苦苦的养大了一个儿子,难道就是为了让他走老子的老路? 带着满心的疑惑,我又进行了下一章的学习,突然恍然大悟,原来还有一个叫exec族函数的东西,专门就是用来给新创建的进程分配工作的. 调用exec族函数并不创建进程…
前言:之前也知道exec族函数,但没有完全掌握,昨天又重新学习了一遍,基本完全掌握了,还有一些父子进程和循环创建子进程的问题,还要介绍一下环境变量,今天分享一下. 一.环境变量 先介绍下环境的概念和特性,再举例子吧. 环境变量,是指在操作系统中用来指定操作系统运行环境的一些参数.通常具备以下特征: ① 字符串(本质) ② 有统一的格式:名=值[:值] ③ 值用来描述进程环境信息. 存储形式:与命令行参数类似.char *[]数组,数组名environ,内部存储字符串,NULL作为哨兵结尾. 使用…
exec族的组成: 在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg…
最近才忙完了一个操作系统的作业,让我们用C语言实现一个Shell.总的来说,其实就是让我们 对系统调用有比较深的了解. 首先 介绍一下我的Shell 所实现的功能.1.运行可执行程序 即输入某个 标志符号 使得其能在我的Shell中运行,并且不退出当前shell.2.获得某个程序的中某个字符串的个数(其实就是调用了/bin/里面的grep) 3.使用管道,实现两个子进程之间的联系,当然不能连shell自己都退出了.. 4.定向输出到某个个文本文件中. 但是在这之前,我想先谈谈我对fork()这个…
os.exec*族主要用来代替当前进程,执行新的程序,不返回值.在UNIX上,新的执行程序加载到当前进程,与调用它的进程有相同的id. os.execl(path, arg0, arg1, ...) os.execle(path, arg0, arg1, ..., env) os.execlp(file, arg0, arg1, ...) os.execlpe(file, arg0, arg1, ..., env)o s.execv(path, args) os.execve(path, arg…
背景 在提到 vfork 函数时,我们提到了这个概念.为了更好地学习与运用,我们对exec族函数进行展开. exec函数族 介绍 有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段.代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了.另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件. 在Linux中使用ex…
问题不出在这几个函数,而在于看后文解释器的时候发现一个很奇妙的问题. #include <unistd.h> int execl(const char *pathname, const char *arg0, ... /* (char *)0 */ ); int execv(const char *pathname, char *const argv []); int execle(const char *pathname, const char *arg0, ... /* (char *)0…
在之前我们已经知道用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行.调用exec并不创建新进程,所以调用exec前后该进程的id并未改变. 其实有六种以exec开头的函数,统称exec函数: #include <unistd.h> int execl(const char *path, const char *ar…
作用 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离.这样的好处是有更多的余地对两种操作进行管理. 当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行.当然,exec系列的函数也可以将当前进程替换掉. 例如:在shell命令行执行ps命令,实际上是shell进程调用fork复制一个新的子进程,在利用exec系统调用将新产生的子进程完全替换成ps进程. 列表 #include <unistd.h> extern char…
1.fork()方式 fork()函数以父进程为蓝本复制一个进程,其ID号与父进程ID号不同.在Linux环境下,fork()是以写复制实现的,只有内存等与父进程不同,其他与父进程共享,只有在父进程或者子进程进行了修改后,才重新生成一份. 2.system()方式 system()函数调用"/bin/sh –c command"执行特定的命令(可参考http://www.cnblogs.com/nufangrensheng/p/3512291.html),阻塞当前进程直到command…
1.为什么需要exec族函数 (1).fork子进程是为了执行新程序(fork创建子进程后,子进程和父进程同时被OS调度执行,因此子程序可以单独的执行一个程序,这样程序宏观上将会和父进程程序同时进行) (2).可以直接在子进程中的if中写入新程序的代码.这样做是可以的,但是不够灵活,因为我们只能把子进程程序的源代码贴过来执行(必须知道源代码,而且源代码如果太长了也不好控制),譬如说我们希望子进程来执行ls -la命令就不行了,因为没有ls的源代码,有的只是编译好的可执行程序. (3).使用exe…
一.简介 How to make a "make"?在进行实现前,应该先对make有一个最基本的了解.这里稍作简介:当一个程序的源文件较少时,对其进行修改并重新生成可执行文件并不复杂,只要将这些文件名作为参数传递给编译器即可:当一个项目的源文件越来越多,对于源文件的修改,必然要重新生成一些中间文件.这时,如果把没有修改的源文件也重新编译,势必会浪费很多时间.make可以根据makefile文件提供的文件依赖,决定哪些中间文件需要重新编译,哪些不需要,从而节约了大量的时间. 因此,实现m…
这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的. 实验题目:Linux环境下的进程控制 实验目的:熟悉并掌握Linux环境下进程的相关函数的应用:守护进程的概念.启动和操作:进程操作程序的编写. 一.Linux进程控制 设计程序,满足如下要求: 1.设计一个程序,要求显示Linux系统分配给此程序的进程号(PID)和它的父进程号(PPID). 在Linux环境下进程创建时,系统会分配一个唯一的数值给每个进程,这个数值就称为进程标示符(pid),他的父进程…
刚接触Linux时,对shell总有种神秘感:在对shell的工作原理有所了解之后,便尝试着动手写一个shell.下面是一个从最简单的情况开始,一步步完成一个模拟的shell(我命名之为wshell)的过程.这个所谓的shell和主流的shell还是有不少区别的,最大的区别是它本身不能执行shell脚本.也不能对一些复杂的命令行进行分析——原因很简单,我没有写相应的解释器.如果想自己实现一个简化的shell脚本解释器,如果有编译原理的知识准备,本身不是难事,但是工作量比较大,这里就不完成了,有兴…
在学习了Linux的进程控制之后,学习了fork函数和exec函数族,通过这些个函数可以简单的实现一份shell,就是实现一份命令行解释器,当然是简单版的,实现功能如下 能执行普通的命令如ls ,ps ,top等 可以实现目录的跳转cd命令 能执行命令并加上参数如ls-l 能执行打开man手册 能识别管道符 还不能实现正则表达式,要实现这个我当前的代码根本不能用,要重头开始改写... 下面贴代码 #include <stdio.h> #include <unistd.h> #inc…
在上Linux课的时候,老师提到一句,调用vfork产生的子进程就是为了使用exec族函数来执行其他的代码逻辑. 在子进程退出的时候有两种方式,exit和exec族函数,不能使用return,为什么不能用return呢,为什么只有vfork会不让用return呢? 于是我就写了这样的代码 #include<stdio.h> #include<unistd.h> #include<stdlib.h> int main() { pid_t pid; pid=vfork();…
本章重点介绍了进程控制的几个函数:fork.exec族._exit.wait和waitpid等,主要需要掌握的是父进程和子进程之间的运行机制,怎么处理进程的正常和异常终止.以及怎么让进程执行不同的程序等知识点.下一章将进一步说明一个进程和其他进程之间的关系——会话和作业控制.…
使用 GDB 调试多进程程序 GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 (tianq@cn.ibm.com), 软件工程师, IBM中国软件开发中心 2007 年 7 月 30 日 内容 在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 GDB 是 linux 系统上常用的 c/c++ 调试工具,功能十分强大.对于较为复杂的系统,比如多进程系统,如何使用 GDB 调试呢?考…
线程间通信,fork(),waitpid(),signal,捕捉信号,用c执行shell命令,共享内存,mmap 实验要求: 1.简单shell: 通过c实现基本的命令行shell操作,实现两个函数,main()和setup(). setup读取用户的下一条指令(最多80个字符),然后分解为独立的标记,并执行,用户按ctrl+D后,程序终止.     Main函数打印提示符COMMAND->,等待用户输入命令,如果用户命令以” &”结尾,则并发执行,否则,父进程需等待子进程 2.创建历史特性…
2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 7)Linux程序设计入门--线程操作 8)Linux程序设计入门--网络编程 9)Linux下C开发工具介绍 1)Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编…
1. 进程的创建 Linux下有四类创建子进程的函数:system(),fork(),exec*(),popen() 1.1. system函数 原型: #include <stdlib.h> int system(const char *string); system函数通过调用shell程序/bin/sh –c来执行string所指定的命令,该函数在内部是通过调用execve("/bin/sh",..)函数来实现的.通过system创建子进程后,原进程和子进程各自运行,…
在unix世界中视一切为文件,无论最基本的文本文件还是网络设备或是u盘,在内核看来它们的本质都是一样的.大多数文件IO操作只需要用到5个函数:open . read . write . lseek 以及 close. 这些函数并不是 ISO C 的组成部分,而是unix的系统调用函数.相比较ISO C中带缓冲的IO操作函数,它们是不带缓冲的IO函数.它们之间的区别看上去是这样的: 可以简单的这么来理解,write函数直接将内容写到文件中.而像printf这样的函数将内容先写到缓冲区,然后由缓冲区…
进程控制 1.进程概述现代操作系统的特点在于程序的并行执行.Linux是一个多用户多任务的操作系统.ps .pstree 查看进程进程除了进程id外还有一些其他标识信息,可以通过相应的函数获得.// 这些函数在unistd.h里声明. 2.Linux进程的结构Linux一个进程由3部分组成:代码段,数据段,堆栈段.代码段存放可执行代码数据段存放程序的全局变量,常量,静态变量堆栈段存放动态分配的内存变量,堆栈中的栈用于函数调用,存放着函数的参数,函数内部定义的局部变量. 3.Linux进程的状态 …
在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: [root@tencent64 ~]# free             total       used       free     shared    buffers     cached Mem:     132256952   72571772   59685180          0    1762632   53034704 -/+ buffe…
关于return和exit 在子进程退出的时候有两种方式,exit和exec族函数,不能使用return,为什么不能用return呢,exit改成return 会出现父子进程又各自重复开始进行. 1.exit函数和return函数的主要区别是: 1)exit用于在程序运行的过程中随时结束程序,其参数是返回给OS的.也可以这么讲:exit函数是退出应用程序,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些运行信息. main函数结束时也会隐式地调用exit函数,exit函数运行时首先…
http://www.cnblogs.com/ggjucheng/archive/2011/12/15/2288710.html GDB 是 linux 系统上常用的 c/c++ 调试工具,功能十分强大.对于较为复杂的系统,比如多进程系统,如何使用 GDB 调试呢?考虑下面这个三进程系统: 进程  Proc2 是 Proc1 的子进程,Proc3 又是 Proc2 的子进程.如何使用 GDB 调试 proc2 或者 proc3 呢? 实际上,GDB 没有对多进程程序调试提供直接支持.例如,使用G…
多进程编程 写在前面的话 本文主要根据本人在UNIX系统上的编程实践经验总结而成, 既做为自己在 一个时期内编程实践的部分总结, 又可成为文章发表. 对UNIX程序员初学者来 说是一个小小的经验, 仅供参考; 对UNIX老手来说则不值一哂, 请各位多多指 教. 一.多进程程序的特点 由于UNIX系统是分时多用户系统, CPU按时间片分配给各个用户使用, 而在 实质上应该说CPU按时间片分配给各个进程使用, 每个进程都有自己的运行环境 以使得在CPU做进程切换时不会"忘记"该进程已计算了…
(转载)http://www.cnblogs.com/zox2011/archive/2013/02/19/2917448.html php有一组进程控制函数,使得php能在*nix系统中实现跟c一样的创建子进程.使用exec函数执行程序.处理信号等功能. 引用 Process Control support in PHP implements the Unix style of process creation, program execution, signal handling and p…
转载:http://tieba.baidu.com/p/1273477757 0 neta 有的时候我们在读书或者看文档.——啊,原来这东西的框架就是这样而已,很直白么.有的时候我们在读代码.——于是也不免有一点抱怨:作者多写一点注释又不会累死.(尤其是在作者花了相当篇幅威胁某个禁止他测试DDoS attacker的管理员但懒得多写点解释的情况下.)不过读完了代码稍微回顾一下的话,又会发现[其实这里那里的根本就不需要注释].如果只求行尸走肉般的实现,OS也是这么一种东西. 有的时候我会想起以前从…
经过试验,qt启动一个新的进程时,这个进程的工作目录是继承父进程的,无论是通过start还是startDetached来启动. 其实对于linux系统,qt底层应该也是调用fork.exec之类的函数,对于fork,参看apue中文版第三版,有以下解析: 在f o r k之后处理文件描述符有两种常见的情况:(1) 父进程等待子进程完成.在这种情况下,父进程无需对其描述符做任何处理.当子进程终止后,它曾进行过读.写操作的任一共享描述符的文件位移量已做了相应更新.(2) 父.子进程各自执行不同的程序…