声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神。也欢迎大家一起探讨,交流,以共同进步~ 0.0

 多进程代码框架示例

/*

    @url:http://www.cnblogs.com/johnnyzen/p/8022597.html
@author:Johnny Zen
@school:XiHua University
@contact:johnnyztsd@gmail.com or 1125418540@qq.com
@date:2017-12-11 13:08
@description:Linux下多进程代码框架[C编程]
@environment:Linux For Ubuntu 16.04/64 */
#include<sys/types.h>
#include<signal.h> int main(){
pid_t sub_a, sub_b, sub_c, sub_d;//4个子进程
while((sub_a = fork()) == -1);//在主进程下,创建子进程a
if(sub_a > 0){//在主进程中,且成功创建子进程a
while((sub_b = fork()) == -1); //在主进程下,创建子进程b
if(sub_b > 0){//在主进程中,且成功创建子进程b
while((sub_c = fork()) == -1); //在主进程下,创建子进程c
if(sub_c > 0){//在主进程中,且成功创建子进程c
while((sub_d = fork()) == -1); //在主进程下,创建子进程d
if(sub_d > 0){//在主进程中,且成功创建子进程d
printf("在主进程中,且已成功创建子进程a/b/c/d:[Current PID:%d; Parent PID:%d;sub_a pid:%d;sub_b pid:%d;sub_c pid:%d;sub_d pid:%d;]\n", getpid(), getppid(), sub_a, sub_b, sub_c, sub_d);
} else {//在子进程d中
printf("在子进程d中:[Current PID:%d; Parent PID:%d;sub_d pid:%d]\n", getpid(), getppid(), sub_d);
}
} else {//在子进程c中
printf("在子进程c中:[Current PID:%d; Parent PID:%d;sub_c pid:%d]\n", getpid(), getppid(), sub_c);
}
} else {//在子进程b中
printf("在子进程b中:[Current PID:%d; Parent PID:%d;sub_b pid:%d]\n", getpid(), getppid(), sub_b);
}
} else { //在子进程a中
printf("在子进程a中:[Current PID:%d; Parent PID:%d;sub_a pid:%d]\n", getpid(), getppid(), sub_a);
} return 0;
}
/* 运行结果: 在子进程a中:[Current PID:4605; Parent PID:4604;sub_a pid:0]
在子进程b中:[Current PID:4606; Parent PID:4604;sub_b pid:0]
在主进程中,且已成功创建子进程a/b/c/d:[Current PID:4604; Parent PID:4189;sub_a pid:4605;sub_b pid:4606;sub_c pid:4607;sub_d pid:4608;]
在子进程c中:[Current PID:4607; Parent PID:4604;sub_c pid:0]
在子进程d中:[Current PID:4608; Parent PID:1520;sub_d pid:0] */

运行效果

另附一份自己的进程相关实验源码

  方便道友们学习之用

#include <stdio.h>
#include <signal.h>
#include <unistd.h> void waiting(),stop(),alarming();
int wait_mark; void main()
{
int p1,p2;//声明两个子进程变量
if(p1=fork())//创建子进程1
{
if(p2=fork())//创建子进程2
{
wait_mark=1;//等待标记
signal(SIGINT,stop);//捕捉中断信号,执行stop
signal(SIGALRM,alarming);//捕捉SIGALRM信号,执行alarming
waiting();//等待软中断信号,5s内按【DEL】发送中断信号SIGINT,否则会向当前进行发送SIGALRM信号。
kill(p1,16);//向子程序p1发送信号16
kill(p2,17);//向子程序p2发送信号17
wait(0);//等待第一个子进程终止
wait(0);//等待第二个子进程终止
printf("parent process is killed!\n");//输出父进程终止
exit(0);//正常终止父进程
}
else
{
wait_mark=1;//等待标记
signal(17,stop);//子进程p2接收到信号后执行stop
signal( SIGINT,SIG_IGN);//忽略中断信号SIGINT对本进程的影响
while(wait_mark!=0);
lockf(1,1,0);//锁定屏幕,不让其他进程输出
printf("children process2 is killed by parent\n");//输出进程2被父进程终止
lockf(1,0,0);//解锁
exit(0);//正常终止进程2
}
}
else
{
wait_mark=1;//等待标记
signal(16,stop);//子进程p2接收到信号后执行stop
signal(SIGINT,SIG_IGN);//忽略中断信号SIGINT对本进程的影响
while(wait_mark!=0)
lockf(1,1,0);//锁定屏幕,不让其他进程输出
printf("children process1 is killed by parent\n");//输出进程1被父进程终止
lockf(1,0,0);//解锁
exit(0);//正常终止进程1
}
}
void waiting()
{
sleep(5);//等待5S
if(wait_mark!=0)
kill(getpid(),SIGALRM);//对当前进程发送SIFALRM信号
}
void alarming()
{
wait_mark=0;
}
void stop()
{
wait_mark=0;
}

参考文献

  原创。

[C++]Linux之多进程运行代码框架的更多相关文章

  1. Virtio:针对 Linux 的 I/O 虚拟化框架

    Virtio:针对 Linux 的 I/O 虚拟化框架 --http://www.ibm.com/developerworks/cn/linux/l-virtio/#ibm-pcon 使用 KVM 和 ...

  2. linux下多进程的调试

    linux下多进程的调试:  (1)follow-fork-mode           set follow-fork-mode [parent | child] ---- fork之后选择调试父进 ...

  3. [转帖]Windows和Linux对决(多进程多线程)

    Windows和Linux对决(多进程多线程) https://blog.csdn.net/world_2015/article/details/44920467 太长了 还没看完.. 还是没太理解好 ...

  4. 自适应大邻域搜索代码系列之(1) - 使用ALNS代码框架求解TSP问题

    前言 上次出了邻域搜索的各种概念科普,尤其是LNS和ALNS的具体过程更是描述得一清二楚.不知道你萌都懂了吗?小编相信大家早就get到啦.不过有个别不愿意透露姓名的热心网友表示上次没有代码,遂不过瘾啊 ...

  5. linux 下 多进程与多线程

    [Linux]多进程与多线程之间的区别 http://blog.csdn.net/byrsongqq/article/details/6339240 网络编程中设计并发服务器,使用多进程与多线程 ,请 ...

  6. linux设备驱动程序--串行通信驱动框架分析

    linux 串行通信接口驱动框架 在学习linux内核驱动时,不论是看linux相关的书籍,又或者是直接看linux的源码,总是能在linux中看到各种各样的框架,linux内核极其庞杂,linux各 ...

  7. 在Linux系统下运行微信Web开发者工具

    微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折. 注:带 * 的步骤或文件为不确定是否管用的步骤或文件.本人系统为Linux ...

  8. linux进程后台运行的几种方法

    转载:http://hi.baidu.com/ntuxmzvdpzbnuxq/item/79131b93f606a348f0421562 我 们经常会碰到这样的问题,用 telnet/ssh 登录了远 ...

  9. linux下编译运行驱动

    linux下编译运行驱动 嵌入式linux下设备驱动的运行和linux x86 pc下运行设备驱动是类似的,由于手头没有嵌入式linux设备,先在vmware上的linux上学习驱动开发. 按照如下方 ...

随机推荐

  1. python安装tesseract

    一.最近在学习python爬虫的时候需要用到tesseract,但书上的给的教程对我并不适用,坑了好久天,才终于成功. 二.方法: 1.由于我看的是静谧博主的那本书.他给的教程在python3安装有问 ...

  2. Class实例在堆中还是方法区中?

    1.JVM中OOP-KLASS模型 在JVM中,使用了OOP-KLASS模型来表示java对象,即:1.jvm在加载class时,创建instanceKlass,表示其元数据,包括常量池.字段.方法等 ...

  3. 通过WebChannel/WebSockets与QML中的HTML交互

    来源:通过WebChannel/WebSockets与QML中的HTML交互 GitHub:八至 作者:狐狸家的鱼 本文链接:QML与HTML交互 在查询QML与HTML之间通信交互时资料很少,这篇文 ...

  4. macOS: sudo : Operation not permitted

    通过查阅资料,了解到这个是之前引入的rootless机制.这让我从Linux换到Mac的用户很不习惯 https://developer.apple.com/videos/play/wwdc2015/ ...

  5. axios请求、返回拦截器

    1.http 请求拦截器 axios.interceptors.request.use(function(config){ //在发送请求之前做些什么 return config }), functi ...

  6. undefined is not an object(evaluating '_react3.default.PropTypes.shape)

    手机红屏报这个错时的解决办法: npm uninstall --save react-native-deprecated-custom-components npm install --save ht ...

  7. 2.Linux基础命令

    linux内一切皆文件,没有文件夹只有目录,目录也是一种文件 1.一些常用按键: 将鼠标的光标从虚拟机里切换回来:Ctrl+Alt 拖动Ubuntu内的对话框:Alt键+鼠标左键拖动 清屏:Ctrl+ ...

  8. JAVA基础语法 我的学习记录

    1.标识符 Java所有的组成部分都需要名字.类名.变量名以及方法名都被称为标识符. 关于Java标识符,有以下几点需要注意: 所有的标识符都应该以字母(A-Z或者a-z),美元符($).或者下划线( ...

  9. navicat premium 12破解流程

    具体步骤:这是破解的具体链接 仅此记录,以供后续之需

  10. TestNg 6.异常测试

    * 什么时候会用到异常测试??* 在我们期望结果为某一个异常的时候* 比如:我们传入了某些不合法的参数,程序抛出异常* 也就是我的预期结果就是这个异常看以下的一段代码: package com.cou ...