fork()和vfork()的区别,signal函数用法,exec()系列函数的用法小结
来源:互联网 发布:警惕网络炒汇陷阱 编辑:程序博客网 时间:2024/05/17 06:03
一:fork()和vfork()的区别:
fork()函数可以创建子进程,有两个返回值,即调用一次返回两个值,一个是父进程调用fork()后的返回值,该返回值是刚刚创建的子进程的ID;另一个是子进程调用fork()后的返回值,该返回值为0。
vfork与fork不同的地方在于:
使用fork()创建子进程时:子进程只是完全复制父进程的资源,并且哪个进程先运行取决于系统的调度算法。
使用vfork()创建子进程时:操作系统并不将父进程的地址空间完全复制到子进程,子进程共享父进程的地址空间,并且保证子进程先运行。
二:signal函数,可以用来处理我们系统的一些信号。
三:exec系列函数(execl,execlp,execle,execv,execvp)函数用法总结:
exec系列函数均可以把当前进程替换成一个新进程,保持原有的pid不变。对于以上函数,我按照自己的理解分为三类,当然这不一定是最好的方法,具体看自己了。
1:execl和execlp:我们给它传入相应命令和参数,它就可以脱离当前进程而独立出来。他们两个的不同在于第一个参数传绝对路径还是相对路径,请看下面例子:
程序的执行结果就是我/home中的内容了,而第10行的内容并不会被打印出来。有没有懂一点点呢,继续;
2:execv和execvp函数:同样,后面有p就是它可以只传入文件名或者命令名就可以执行,不过它的参数可以自己用argv[]传进去。
看吧,主要是execv和execvp只能传入两个参数,所以把其他的东西就放在argv[]中了,执行成功返回0,失败返回-1。
3:execle函数,可以获得环境变量,看下面例子:
(注意:test_execle_child 是一个可以打印当前环境变量的函数)
test_execle_child函数如下:
当函数是execle时:输出我们envp中传进去的环境变量,
当函数时execl时:输出我们当前执行进程的环境变量。
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()注释去掉,而将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
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;
- }
三: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;
- }
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;
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;
当函数时execl时:输出我们当前执行进程的环境变量。
0
上一篇:RedHat 7.0 下 FTP 服务的安装,启动,配置,以及虚拟用户的建立
下一篇:linux top 命令详解
相关热门文章
- linux 常见服务端口
- 【ROOTFS搭建】busybox的httpd...
- xmanager 2.0 for linux配置
- 什么是shell
- linux socket的bug??
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- fork()和vfork()的区别,signal函数用法,exec()系列函数的用法小结
- vfork,fork,exec函数的区别
- vfork,fork,exec函数的区别
- vfork,fork,exec函数的区别
- vfork,fork,exec函数的区别
- vfork,fork,exec函数的区别
- fork和vfork函数的区别
- linux中fork()和vfork()函数的使用和区别
- fork与vfork函数的区别
- 进程创建函数fork和vfork的区别
- 进程创建函数fork和vfork的区别
- Linux下fork()、vfork()、clone()和exec()的区别
- Linux下fork()、vfork()、clone()和exec()的区别
- Linux下fork()、vfork()、clone()和exec()的区别
- fork, vfork, clone, exec的区别
- UC编程7-进程创建函数fork/vfork 和 execl/信号signal的使用1
- linux 下fork函数和exec 函数的区别
- fork函数的用法
- solr学习
- zoj 2100 Seeding 【dfs】
- 【Linux】如何用shell编写斐波那契函数
- Linux&C open creat read write lseek 函数用法总结
- openwrt 应用程序之netifd
- fork()和vfork()的区别,signal函数用法,exec()系列函数的用法小结
- linux top 命令详解
- 时间Date的各种获取方式
- SQL server2008 身份认证模式修改密码
- LVM&RAID
- 解决virtul box 无法调大分辨率的方法
- 线程创建,属性设置与获得,等待线程结束,线程中fork,以及执行exec()
- Contest 4 1009 Walk Out【bfs】
- 利用坐标求任意多边形面积
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
蟑螂为什么往人身上爬
走过了人来人往
万人
万人敌
学万人敌
英雄无敌之万人敌
战国万人敌 鲨鱼禅师
鲨鱼禅师 战国万人敌
万人斩
万界次元群
支付宝一次能转20万吗
活了100万次的猫
二次元之万界守护者
次元万界从龙珠开始
万界次元公会
万次火柴
次元之万界殿堂
珲春口岸40万人次
登游万界之我知道剧情
万王之王3d手游平民职业选择
诸天之舟游万界
大话手游万兽园必出高级
登游万界之快人百步 大红袍
万人国战的手游有哪些
人为什么那么烦
人为什么会烦
就想嫁个老实人 沐小烦
二手后八轮自卸车10万
万轮科技园
二手后八轮个人出售6万
3万左右农用六轮汽车
1万左右二手五征五轮车
2万左右农用六轮
三国无双万人轮孙尚香
穿成天生万人迷
穿书后她成万人迷
干掉万人迷
万人迷
快穿万人迷
快穿之万人迷
万人迷养成系统