fork和exec一起使用
先预览一下工程的目录树:
实现的功能:master进程启动slave进程。
看看Makefile内容:
all: master.out slave.out master.out: master.cpp
g++ master.cpp -o master.out slave.out: slave.cpp
g++ slave.cpp -o slave.out clean:
rm -rf *.out
master.cpp内容:
/*************************************************************************
* File: a.cpp
* Brief:
* Created Time: Wed 23 Dec 2015 08:50:13 AM CST
************************************************************************/ #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<signal.h>
using namespace std; #define Sleep(ms) usleep(ms * 1000) int main(int argc,char* argv[])
{
printf("pid=%d, ",getpid());
for(int i=; i<argc;i++)
printf("[%d]=%s, ",i,argv[i]);
printf("\n"); struct sigaction sigchld_action;
sigchld_action.sa_handler = SIG_DFL;
sigchld_action.sa_flags = SA_NOCLDWAIT;
sigaction(SIGCHLD, &sigchld_action, NULL); //new process
int m_subProcessID=fork();
if (m_subProcessID==)
{
int ret=execl("./slave.out","a=abc","b=def","c=12345",NULL);
if(!=ret)
{
printf("execl fails.\n");
return -;
}
printf("execl done wit ok\n");
return ;
}
for(int i=;i<;i++)
{
Sleep();
printf("master say: i=%d\n",i);
}
printf("master say: i am done\n");
return ;
}
slave.cpp内容:
/*************************************************************************
* File: a.cpp
* Brief:
* Created Time: Wed 23 Dec 2015 08:50:13 AM CST
************************************************************************/ #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<signal.h>
using namespace std; #define Sleep(ms) usleep(ms * 1000) int main(int argc,char* argv[])
{
printf("pid=%d, ",getpid());
for(int i=; i<argc;i++)
printf("[%d]=%s, ",i,argv[i]);
printf("\n"); for(int i=;i<;i++)
{
Sleep();
printf("slave say: -----------------------------------------------------ndex=%d\n",i);
}
printf("slave say: i am done\n");
return ;
}
make编译,看看运行效果:
[root@localhost testfork]# ./master.out
pid=, []=./master.out,
pid=, []=a=abc, []=b=def, []=c=,
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
master say: i=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
master say: i=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
master say: i=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
master say: i=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
master say: i=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
master say: i=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
master say: i=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
master say: i=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
master say: i=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
master say: i=
master say: i am done
[root@localhost testfork]# slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: -----------------------------------------------------ndex=
slave say: i am done [root@localhost testfork]#
可见,在第38行,master正常退出。在第55行,slave也正常退出。
注意到,我们常规启动进程的时候,进程打印的启动参数里面第一个是程序文件名称(也可能包含了路径)。而在这里,我们看到slave.out通过exec函数启动的时候,启动参数里的第一个参数变成了我们在exec函数里设置的参数"a=abc"。
在两个进程都运行的时候,我们查看一下进程信息:
ps -A |grep -sn --color=auto "master\.out\|slave\.out"
master的进程ID为7749,slave的进程ID为7750,两个进程为父子进程。
这里说说fork,在父进程运行到fork时,会分离出一个子进程。两个进程的内存完全一样,子进程会共享父进程当前持有的内核对象,包括互斥量这些同步变量。
例如,父进程打开了一个文件FILE* fp,子进程fclose后,父进程调用fwrite不会报错,但实际上数据并没有写入文件。
资源:
百度网盘\软件源码\testfork.zip
完。
fork和exec一起使用的更多相关文章
- 【转】Linux下Fork与Exec使用
Linux下Fork与Exec使用 转自 Linux下Fork与Exec使用 一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.for ...
- Linux下Fork与Exec使用
Linux下Fork与Exec使用 一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.fork函数是Unix系统最杰出的成就之一, ...
- linux进程之fork 和 exec函数
---恢复内容开始--- fork函数 该函数是unix中派生新进程的唯一方法. #include <unistd.h> pid_t fork(void); 返回: (调用它一次, 它 ...
- linux c语言 fork() 和 exec 函数的简介和用法
linux c语言 fork() 和 exec 函数的简介和用法 假如我们在编写1个c程序时想调用1个shell脚本或者执行1段 bash shell命令, 应该如何实现呢? 其实在<std ...
- Linux下Fork与Exec
一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期 ...
- fork 和 exec
https://blog.csdn.net/disadministrator/article/details/39347333 进程创建方法:fork.exec.clone,父进程等待子进程结束是用w ...
- fork、exec 和 exit 对 IPC 对象的影响
GitHub: https://github.com/storagezhang Emai: debugzhang@163.com 华为云社区: https://bbs.huaweicloud.com/ ...
- Linux fork()、exec() Hook Risk、Design-Principle In Multi-Threadeed Program
目录 . Linux exec指令执行监控Hook方案 . 在"Multi-Threadeed Program"环境中调用fork存在的风险 . Fork When Multi-T ...
- fork和exec函数
#include<unistd.h> pid_t fork(void); 返回:在子进程中为0,在父进程中为子进程IO,若出错则为- fork最困难之处在于调用它一次,它却返回两次.它在调 ...
随机推荐
- int[] List<int> 排序
; List<,,,,,,}; ,,,,}; List<int> result = allingInts.ToList(); result.Sort(); allingInts = ...
- html 把左框的选中项添加到右框
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- set ver on/off
set verify(或ver) on/off可以设置是否显示替代变量被替代前后的语句 SQL> set verify on SQL> select &num from d ...
- 解决plsql工具不能用中文字进行模糊匹配
今天碰到了 select * from table1 t where t.name like '模块a' 查不出数据 而select * from table1 t where t.name like ...
- linux:ACL权限
ACL权限是为了防止权限不够用的情况,一般的权限有所有者.所属组.其他人这三种,当这三种满足不了我们的需求的时候就可以使用ACL权限: 比如:一个网络老师,给一个班的学员上课,他在linux的根目录下 ...
- WebService之Axis2 后续(6)~(10)目录
WebService大讲堂之Axis2(6):跨服务会话(Session)管理 WebService大讲堂之Axis2(7):将Spring的装配JavaBean发布成WebService WebSe ...
- C++Primer 第十章
//1.标准库算法不仅可以应用于容器,还可以应用于内置数组,指针. //2.大多数算法都定义在头文件algorithm中.标准库还在头文件numeric中定义了一组数值泛型算法. //3.算法本身不会 ...
- Swift游戏实战-跑酷熊猫 13 二段跳的实现
这节内容我们来实现熊猫的二段跳. 要点: 二段跳的逻辑: 逻辑一,第一次点击屏幕,status就会变成jump. 逻辑二,第二次点击屏幕,status就会变成jump2. 逻辑三,当status变成j ...
- 微信开发---------jsapi_ticket拿不到的问题。
今天代码没动,出现的问题是分享朋友圈,朋友,分享到QQ,我设置的分享链接都失效了.找来找去也不知道什么原因,没办法就只有一个个打印参数并查看文档,先把jssdk页面上的debug设置为true(微信原 ...
- 转:Python itertools模块
itertools Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数. 首先,我们看看itertools提供的几个"无限"迭代器: >>& ...