fork()和vfork()的区别,signal函数用法,exec()系列函数的用法小结
一:fork()和vfork()的区别:
fork()函数可以创建子进程,有两个返回值,即调用一次返回两个值,一个是父进程调用fork()后的返回值,该返回值是刚刚创建的子进程的ID;另一个是子进程调用fork()后的返回值,该返回值为0。
vfork与fork不同的地方在于:
使用fork()创建子进程时:子进程只是完全复制父进程的资源,并且哪个进程先运行取决于系统的调度算法。
点击(此处)折叠或打开
- int globVar = 5;
- int main(int argc,char *argv[])
- {
- int var = 1,i;
- pid_t pid;
- printf("fork is different with vfork\n");
- pid = fork();
- // pid = vfork();
- printf("%d---------\n",pid);
- switch(pid)
- {
- case 0:
- i = 2;
- while(i-- > 0)
- {
- printf("--------Child process is running\n");
- globVar++;
- var++;
- printf("--------c sleep\n");
- sleep(1);
- }
- printf("--------Clild's globVar = %d,var = %d\n",globVar,var);
- break;
- case -1:
- perror("Process creat faild\n");
- exit(0);
- default:
- i = 3;
- while(i-- > 0)
- {
- printf("Parent process is running\n");
- globVar++;
- var++;
- printf("p sleep\n");
- sleep(1);
- }
- printf("Parent's globVar = %d,var = %d\n",globVar,var);
- exit(0);
- }
- }
- fork is different with vfork
- 14070---------
- Parent process is running
- p sleep
- 0---------
- --------Child process is running
- --------c sleep
- Parent process is running
- p sleep
- --------Child process is running
- --------c sleep
- Parent process is running
- p sleep
- --------Clild's globVar = 7,var = 3
- Parent's globVar = 8,var = 4
使用vfork()创建子进程时:操作系统并不将父进程的地址空间完全复制到子进程,子进程共享父进程的地址空间,并且保证子进程先运行。
点击(此处)折叠或打开
- 将上面的例子vfork()注释去掉,而将fork();注释掉,可以得到与之不同的结果
- fork is different with vfork
- 0---------
- --------Child process is running
- --------c sleep
- --------Child process is running
- --------c sleep
- --------Clild's globVar = 7,var = 3
- 14160---------
- Parent process is running
- p sleep
- Parent process is running
- p sleep
- Parent process is running
- p sleep
- Parent's globVar = 10,var = 32714
二:signal函数,可以用来处理我们系统的一些信号。
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler));
函数的第一个参数指定该信号的值,第二个参数指定对该信号的处理。可以忽略该信号。参数设为(SIG_ING),也可以采用系统默认的方式,参数设置为(SIG_DFL),下面的例子就是忽略我们的输入信号。
点击(此处)折叠或打开
- #include<stdio.h>
- #include<signal.h>
- int main(int argc ,char *argv[])
- {
- signal(SIGINT,SIG_IGN);
- for(;;);
- return 0;
- }
执行结果就是无限循环,我们ctrl+c也无法停止。
三:exec系列函数(execl,execlp,execle,execv,execvp)函数用法总结:
exec系列函数均可以把当前进程替换成一个新进程,保持原有的pid不变。对于以上函数,我按照自己的理解分为三类,当然这不一定是最好的方法,具体看自己了。
1:execl和execlp:我们给它传入相应命令和参数,它就可以脱离当前进程而独立出来。他们两个的不同在于第一个参数传绝对路径还是相对路径,请看下面例子:
点击(此处)折叠或打开
- #include<stdio.h>
- #include<stdlib.h>
- #include<unistd.h>
- int main(int argc,char *argv[])
- {
- printf("entering main process----\n");
- // execl("/bin/ls","ls","-l","/home",NULL);
- // execlp("ls","ls","-l","/home",NULL);
- printf("exiting main process -----\n");
- return 0;
- }
程序的执行结果就是我/home中的内容了,而第10行的内容并不会被打印出来。有没有懂一点点呢,继续;
2:execv和execvp函数:同样,后面有p就是它可以只传入文件名或者命令名就可以执行,不过它的参数可以自己用argv[]传进去。
点击(此处)折叠或打开
- int ret;
- printf("entering main process----\n");
- char *argv[] = {"ls","-l","/home",NULL};
- // ret = execv("/bin/ls",argv);
- ret = execvp("ls",argv);
- if(ret == -1)
- {
- perror("execvp error");
- }
- printf("exiting main process-----\n");
- return 0;
看吧,主要是execv和execvp只能传入两个参数,所以把其他的东西就放在argv[]中了,执行成功返回0,失败返回-1。
3:execle函数,可以获得环境变量,看下面例子:
(注意:test_execle_child 是一个可以打印当前环境变量的函数)
test_execle_child函数如下:
点击(此处)折叠或打开
- extern char ** environ;
- int main(int argc,char *argv[])
- {
- int i ;
- printf("\n\n现在已经进入main函数中的子程序---- pid=%d\n",getpid());
- sleep(2);
- for(i = 0;environ[i] != NULL;i++)
- {
- printf("%s\n",environ[i]);
- }
- return 0;
- }
点击(此处)折叠或打开
- int ret;
- char * const envp[] = {"aa=11","bb=22","cc=33",NULL};
- printf("entering main process----\n");
- // ret = execl("./test_execle_child","test_execle_child",NULL);
- ret = execle("./test_execle_child","test_execle_child",NULL,envp);
- if(ret == -1)
- {
- perror("execle error");
- }
- printf("exiting main process-----\n");
- return 0;
当函数是execle时:输出我们envp中传进去的环境变量,
当函数时execl时:输出我们当前执行进程的环境变量。
阅读(1) | 评论(0) | 转发(0) |
版权声明:本文为博主原创文章,未经博主允许不得转载。
fork()和vfork()的区别,signal函数用法,exec()系列函数的用法小结的更多相关文章
- fork()和vfork()的区别(转载)
fork和vfork 转载 http://coolshell.cn/articles/12103.html 在知乎上,有个人问了这样的一个问题--为什么vfork的子进程里用return,整个程序会挂 ...
- exec系列函数(execl,execlp,execle,execv,execvp)使用
本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...
- linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用
本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...
- exec系列函数和system函数
一.exec替换进程映象 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离.这样的好处是有更多的余地对两种操作进行管理.当我们创建 了一个进程之后,通常将子进程替换成新 ...
- fork和vfork的区别
参见百度百科API说明: fork 头文件: #include<unistd.h> #include<sys/types.h> 函数原型: pid_t fork( void); ...
- Linux系统编程(9)—— 进程之进程控制函数exec系列函数
在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **environ; int exe ...
- 进程基本-进程创建,僵尸进程,exec系列函数
Linux系统中,进程的执行模式划分为用户模式和内核模式,当进程运行于用户空间时属于用户模式,如果在用户程序运行过程中出现系统调用或者发生中断事件,就要运行操作系统(即核心)程序,进程的运行模式就变为 ...
- exec系列函数详解
execve替换进程映像(加载程序):execve系统调用,意味着代码段.数据段.堆栈段和PCB全部被替换.在UNIX中采用一种独特的方法,它将进程创建与加载一个新进程映像分离.这样的好处是有更多的余 ...
- PHP 使用 curl_* 系列函数和 curl_multi_* 系列函数进行多接口调用时的性能对比
在页面中调用的服务较多时,使用并行方式,即使用 curl_multi_* 系列函数耗时要小于 curl_* 系列函数. 测试环境 操作系统:Windows x64 Server:Apache PHP: ...
随机推荐
- Jmeter系类(31) - JSR223(1) | 控件介绍
JSR233 介绍 JSR223控件执行JSR223脚本代码用于创建/更新所需的某些变量 JSR223可以使用其内置的变量,有助于精简脚本,提高开发测试的效率 由于JSR223脚本编译方式基本相同,J ...
- python学习笔记(二)-字符串方法
python的字符串内建函数: #====================常用方法=============================name = 'besttest' new_name = n ...
- 使用亚马逊服务器报错:Signature not yet current: 20190726T070253Z is still later than 20190726T070246Z (20190726T065746Z + 15 min.)时间不同步的解决办法
1.首先获取亚马逊的时间: $ curl http://s3.amazonaws.com -v 2.更改当前服务器时间,使之与亚马逊时间同步 $ date -s 'xxxx-xx-xx xx:xx:x ...
- CF622F-The Sum of the k-th Powers【拉格朗日插值】
正题 题目链接:https://www.luogu.com.cn/problem/CF622F 题目大意 给出\(n,k\),求 \[\sum_{i=1}^ni^k \] 解题思路 很经典的拉格朗日差 ...
- P5437-[XR-2]约定【拉格朗日差值,数学期望】
正题 题目链接:https://www.luogu.com.cn/problem/P5437 题目大意 \(n\)个点的完全图,连接\(i,j\)的边权值为\((i+j)^k\).随机选出一个生成树, ...
- MySQL安装指导文档
MySQL 是最流行的关系型数据库管理系统,可以在本地搭建一个mysql的环境,便于学习. windows7/windows10 5.7.26 安装mysql前环境准备工作 1) 要有Net fram ...
- selenium--常用的获取元素属性
当我们要设计功能测试用例时,一般会有预期结果,有些预期结果测试人员无法通过肉眼进行判断的.因为自动化测试运行过程是无人值守,一般情况下,脚本运行成功,没有异样信息就标识用户执行成功.那怎么才能知道我打 ...
- Sentry 监控 - 全栈开发人员的分布式跟踪 101 系列教程(第一部分)
系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...
- HTML选择器的四种使用方法
选择器<style> 为了让.html代码更加简洁,这里引入选择器style 本文总共介绍选择器的四种使用方式 一.选择器的四种形式 1.ID选择器 id表示身份,在页面元素中的id不允许 ...
- Windows下的程序及热键监视神器——Spy++
Windows下的程序及热键监视神器--Spy++ 背景 在使用Windows的时候,偶尔会发现某些应用程序的热键不生效了:又或是桌面弹出了弹框却并不知道这个弹框来自何处.例如,本人最近使用Vim的时 ...