技术标签: system null Linux系统编程 shell linux firefox testing
1. 系统调用exec是以新的进程去代替原来的进程,但进程的PID保持不变。因此,可以这样认为,exec系统调用并没有创建新的进程,只是替换了原来进程上下文的内容。原进程的代码段,数据段,堆栈段被新的进程所代替。
一个进程主要包括以下几个方面的内容:
(1)一个可以执行的程序
(2) 与进程相关联的全部数据(包括变量,内存,缓冲区)
(3)程序上下文(程序计数器PC,保存程序执行的位置)
exec是一个函数簇,由6个函数组成,分别是以excl和execv打头的。具体如下:
execl(const char* filepath,const char* arg1,char*arg2......)
execlp(const char*filename,const char*arg1,const char*arg2..... )
execle(const char*filepath,const char*arg1,const char*arg2,.....,char* cons envp[])
execv (const char* filepath,char* argv[])
execvp (const char* filename,char* argv[])
execve (const char* filepath,char*argv[],char* const envp[])
execl与execv的主要区别:
(1) 以execl开头的函数第二个参数传递的是参数的个数,一一列举出来。而以execv开头的函数把参数放到指针数组里面去。
(2) execlp与execvp第二个参数是文件名,而其它的都需要命令的完整的路径名。
(3) execle与execve需要传递环境信息,即把新的环境指定到新的进程中去,而其它的函数并没有传递环境,而是将原来的环境默认为新进程的环境。
对于列举出参数的execl族函数来说,第二个参数的第一个是命令名,第二个是命令参数,最后一个为NULL.
对于使用参数列表的execv族函数来说,第二个参数的第一个也是命令名,第二个是命令参数,最后一个为NULL.也可以从命令行输入。
执行exec系统调用,一般都是这样,用fork()函数新建立一个进程,然后让进程去执行exec调用。我们知道,在fork()建立新进程之后,父进各与子进程共享代码段,但数据空间是分开的,但父进程会把自己数据空间的内容copy到子进程中去,还有上下文也会copy到子进程中去。而为了提高效率,采用一种写时copy的策略,即创建子进程的时候,并不copy父进程的地址空间,父子进程拥有共同的地址空间,只有当子进程需要写入数据时(如向缓冲区写入数据),这时候会复制地址空间,复制缓冲区到子进程中去。从而父子进程拥有独立的地址空间。而对于fork()之后执行exec后,这种策略能够很好的提高效率,如果一开始就copy,那么exec之后,子进程的数据会被放弃,被新的进程所代替。
2. exec实例
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char* argv[]){
char * envp[]={"PATH=/tmp",
"USER=lei",
"STATUS=testing",
NULL};
int i;
char*argv1[3];//定义一个指针数组
argv1[0]="cat";
argv1[1]="/etc/inittab";
argv1[2]=NULL;
if(fork()==0){//需要为新进程指定新的执行环境
if(execve("/bin/cat",argv1,envp)==-1){//返回值为-1,调用失败
perror("error on execve");
}
}
return 0;
}
利用exec系统调用,可以实现一个简单的应用,如当打开Linux系统时,如果你想上网,又不愿意在命令行输入,并且你还想在连网的时候同时打开浏览器,那么下面的例子就可以实现:
/**
作一个命令,首先打开锐捷,即mentohust,再打开firefox
execlp(const char* file,const char* argv1,const char* argv2,const char* argv3,.....);
exec一旦调用,永远不会返回原来的程序
system是通过调用shell来实现命令的
**/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(){
char *argv[]={"firefox",NULL};
char *envp[]={"PATH=/tmp",
"USER=lei",
"STATUS=testing",
NULL};
if(fork()==0){
if(execlp("mentohust","mentohust",NULL)<0)
perror("error on mentohust");
}
if(fork()==0){
if(execlp("firefox","firefox",NULL)<0)
perror("error on firefox");
}
return 0;
}
这个例子,首先fork()一个进程,系统调用打开锐捷,然后接着fork()另外一个进程,系统调用打开firefox.
3. exec与system的区别
(1) exec是直接用新的进程去代替原来的程序运行,运行完毕之后不回到原先的程序中去。
(2) system是调用shell执行你的命令,system=fork+exec+waitpid,执行完毕之后,回到原先的程序中去。继续执行下面的部分。
总之,如果你用exec调用,首先应该fork一个新的进程,然后exec. 而system不需要你fork新进程,已经封装好了。
MNN--初步学习
用网页原生的navigator.getUserMedia录音,然后传音频流给Unity进行转AudioClip播放。
结构体的自引用(selfreference),就是在结构体内部,包含指向自身类型结构体的指针。结构体的相互引用(mutualreference),就是说在多个结构体中,都包含指向其他结构体的指针。1. 自引用 结构体1.1 不使用typedef时错误的方式:[cpp]struct tag_1{struct tag_1 A; /* 结构体 */int value;};[/cpp]这种声明是错误的,因...
1.通过F12进入代码页面,通过shift+ctrl+c键可以选择页面上面的元素。通过这种方式,获取对应元素的ID值。在通过var a1=document.getElementById("id名").value; //通过document.getElementById(“id名”).value来获取value值。2.这里我获取到的日期和时间是分开的,所以我们要先进行合并。但日期类型的数据无法直接合并,需要通过数据转换。var t1= a1.toString();//通过toString()将日期
虚拟机centOS 7显示“以太网(ens33,被拔出)”的原因是两个服务被禁用了。 这是我设置后的截图。。解决办法:1.首先查看网络连接方式选择菜单中的“虚拟机”,再选择“设置”,选择“网络适配器”,查看网络连接方式设置。这里我选择的是“NAT模式”。 2. 开启相关服务在桌面选中“计算机”,左键“管理”,打开计算机管理窗口。 点击“服务和应用”,选择“服务”,...
“首创精简卷技术、融合存储的缔造者、第一个开辟软件定义存储市场、首创存储人工智能、第一家推出IDP智能存储平台、第一家实现并行多控制存储平台……”过去十年,论对于存储趋势的洞察、把控与引领,新华三存储一路领先,业内可能无出其右。下一个十年,数字经济、产业数字化、数字化转型无不是需要以数据为基础,与数据打交道紧密的企业存储愈发重要。那么,企业存储将走向何方?在2021 NAVIGATE 领航者峰会上,新华三带来了它的深度思考。在新华三看来,智能和速度将是未来十年企业存储最为核心的两大趋势。与其他人云亦
和大家一起聊聊如何使用python做Windows一、环境安装 使用python实现来做PC端自动化,前提是先安装好python,那么还需要用到一个第三方库:pip install二、使用说明安装好了之后,关于使用说明大家可以参照官方文档上的说明内容翻译如下:就是说在我们安装好Pywinauto之后,首先要确定哪种可访问性技术(pywinauto的backend)可以用于我们的应用Win32 A...
转载请声明出处:导言:通常在OpenGL里面绘制的都是默认的黑色背景,对于有些时候,太过于单调了,现在我们可以对它加上背景,实现一个不错的图形.在网上看到人家要实现星空图,找到一张星空图片贴在背景上面.看一下效果图原理:看一下下面的这张图:这是OpenGL里面摄像机的原理图,我们要绘制的物体在离摄像机近的地方,那个离摄像机远的矩形
转 Paoding Rose使用手册 2015年05月28日 11:07:04 winwill2012 阅读数:4374 ...
目录 具体内容 文件操作 1:文件操作介绍 2:文件的打开与关闭 3:文件的读写 4:文件及文件夹的相关操作 异常处理 1:异常介绍 2:捕获异常 3:异常的传递 4:抛出自定义的异常 5:异常处理中抛出异常 一、文件的介绍1 :什么是文件?如下图展示数据image-20210117130855293.png2 文件的作用使用文件的目的:保存数据存放在磁盘把一些存储存放起来,可以让程序下一次执行的时候.
今天项目要提供一个版本给现场的同事做测试,并且初始化数据当中有blob数据,所以为了解决这个问题在网上找了好些资料东凑西凑终于把这个给弄好了,代码大概就是这样://将数据库中的blob数据存储为txt文件public static void export(){ String url = Global.getConfig("db.rsk.url");//数据连接 St
目录一、问题需求二、解决方案方法一、使用os库方法二、使用glob库一、问题需求 最近要批量处理一批文件,那怎么挨个自动化导入这些文件的路径和名称呢,这肆意而为起的文件名称,手工一个个编辑肯定是不行的。必须得有相应的方法解决这一机械化的操作。话不多说,上解决方案。二、解决方案方法一、使用os库os库就不多说了,就是使用os.walk()函数1。os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向