孙子进程和共享内存的应用

fork两次然后在孙子进程中调用某函数避免孙子进程被kill掉产生僵尸进程


/*
这样做儿子进程很快就会退出,所以孙子进程不太可能产生僵尸进程,即使产生时间也极其短暂 */

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

void fork_grandson_run(void func(void));

void print_name(void);

int main(void)

{

int i;

for (i = 0; i < 10; i++) {

fork_grandson_run(print_name);

}

return 0;

}

void print_name(void)

{

// printf("my name is zhangbolun \n");

execlp("ls", "ls", "-a", NULL);

}

void fork_grandson_run(void func(void))

{

pid_t pid, pid2;

pid = fork();

if (pid < 0) {

perror("fork failed ");

exit(1);

} else if (pid == 0) { // son

pid2 = fork();

if (pid2 < 0) {

perror("fork failed ");

exit(1);

} else if (pid2 == 0) {

func();

exit(0);

} else {

exit(0);

}

} else { // parent

// do nothing

}

}

需要注意是:

wait()函数不能等待孙子进程,可以等待子进程

for(;wait((int*)0)>0;);这里的for循环的作用就是等到退出成功才往下运行,否则一直在等待;

共享内存的应用

/*共享内存申请标记*/
#define PERM S_IRUSR|S_IWUSR

/*孙子进程id号*/
pid_t gradchild;

/*子进程id号*/
pid_t pid;

/*共享内存描述标记*/
int shmid;

/*共享内存:用于存放子进程ID,播放列表位置*/
if((shmid = shmget(IPC_PRIVATE,5,PERM))== -1)
exit(1);

//内存映射

p_addr = shmat(shmid,0,0);

/*内存映射*/
c_addr = shmat(shmid,0,0);

/*把孙子进程的id和当前播放歌曲的节点指针传入共享内存*/
memcpy(c_addr,&fd,sizeof(pid_t));
memcpy(c_addr + sizeof(pid_t)+1,&currentsong,4);


/*把孙子进程的pid传给父进程*/
memcpy(&gradchild,p_addr,sizeof(pid_t));

最后补充:

共享内存是进程间通信(IPC)的一种。因为进程在使用共享内存时,可以直接读写内存,不需 要任何数据拷贝,所以它的效率是最高的。关于共享内存是内核专门留出来的一块内存,这段内存可以让访问的进程映射到自己的私有地址空间,从而可以操作共享 内存。 共享内存可以让不同的进程来映射地址,从而实现了进程之间的通信。

多个程序都来操作共享内存,需要一种同步机制,下面来介绍信号同步的机制。

共享内存的实现分为三步:第一步是创建共享内存,用的函数是shmget()函数;第二步是映射共享内存,用的函数是shmat();最后一步是撤销映射,用的函数是shmdt()。

建立好共享内存后,我是用信号来实现同步机制的,当然也可以用信号量等其他的。 使用信号需要了解kill()信号发送函数和signal()捕捉信号函数。首先kill函数需要知道对方进程的进程号,所以第一步就是获得对方的进程 号,可以通过共享内存获得。然后获得自己的进程号再通过共享内存发给对方。

这样当一个进程操作完以后,就可以发信号给另一个进程,实现了进程之间的同步。

可参考华清远见嵌入式学院免费课堂:http://www.embedu.org/lecture/

时间: 2024-09-29 20:39:54

孙子进程和共享内存的应用的相关文章

进程-IPC 共享内存和消息队列 (三)

详见:https://github.com/ZhangzheBJUT/linux/blob/master/IPC(%E4%B8%89).md 五 共享内存 5.1. 共享内存简介 共享内存指多个进程共享同一块物理内存,它只能用于同一台机器上的两个进程之间的通信.在进程的逻辑地址空间中有一段地址范围是用来进行内存映射使用的,该段逻辑地址空间可以映射到共享的物理内存地址上(进程空间介绍:http://blog.csdn.net/zhangzhebjut/article/details/3906025

Linux程序设计学习笔记----System V进程通信(共享内存)

转载请注明出处:http://blog.csdn.net/suool/article/details/38515863 共享内存可以被描述成内存一个区域(段)的映射,这个区域可以被更多的进程所共享.这是IPC机制中最快的一种形式,因为它不需要中间环节,而是把信息直接从一个内存段映射到调用进程的地址空间. 一个段可以直接由一个进程创建,随后,可以有任意多的进程对其读和写.但是,一旦内存被共享之后,对共享内存的访问同步需要由其他 IPC 机制,例如信号量来实现.象所有的System V IPC 对象

Windows进程间共享内存通信实例

抄抄补补整出来 采用内存映射文件实现WIN32进程间的通讯:Windows中的内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在WIN32进程中保留一段内存区域,把硬盘或页文件上的目标文件映射到这段虚拟内存中.注意:在程序实现中必须考虑各进程之间的同步问题. 在Windows操作系统下,任何一个进程不允许读取.写入或是修改另一个进程的数据(包括变量.对象和内存分配等),但是在某个进程内创建的文件映射对象的视图却能够为多个其他进程所映射,这些进程共享的是物理存储器的同一个页面. 因

Windows进程通信 -- 共享内存

享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 Windows 中是用 FileMapping 实现的,从具体的实现方法上看主要通过以下几步来实现: 1.调用 CreateFileMapping 创建一个内存文件映射对象: HANDLE CreateFileMapping( HANDLE hFile, // handle to file to map

Linux学习笔记(14)-进程通信|共享内存

共享内存是允许两个不相关的进程访问同一个逻辑内存的进程间通信方法,是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式. 不同进程之间共享的内存通常安排为同一段物理内存.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址. 就好像它们是由用C语言malloc()分配的内存一样.

linux下进程通信方式--共享内存

1.概念 不同进程看到共同区域 2.特点 (1)是进程间通信最快的方式,对不同内存的映射(少了两次拷贝) (2)不提供任何同步互斥机制,也不自己维护 (3)接口简单 3.通信方式 由文件系统提供--管道 由system V提供--消息队列.信号量.共享内存 共享内存与信号量搭配使用 4.实现shmat.shmdt at:挂接   dt:去挂接 0 1 2 1 0 创建 挂接 被另一进程看到 退出 再退出 代码实现: shm.h文件: #ifndef __SHM__#define __SHM__

C# 进程间共享内存通信方式

从别处看到一篇文章做进程间通信很好使,唯一的问题是,需要注意using的用法,Using有个用法3, using 语句允许程序员指定使用资源的对象应当何时释放资源.using 语句中使用的对象必须实现 IDisposable 接口.此接口提供了 Dispose 方法,该方法将释放此对象的资源. ①可以在 using 语句之中声明对象.     Font font2 = new Font("Arial", 10.0f);     using (font2)     {         /

Windows进程通信 -- 共享内存(1)

共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 Windows 中是用 FileMapping 实现的,从具体的实现方法上看主要通过以下几步来实现: 1.调用 CreateFileMapping 创建一个内存文件映射对象: HANDLE CreateFileMapping( HANDLE hFile, // handle to file to ma

生产者消费者模型,管道,进程之间共享内存,进程池

课程回顾: 并行:在同一时间点上多个任务同时执行 并发:在同一时间段上多个任务同时执行 进程的三大基本状态: 就绪状态:所有进程需要的资源都获取到了,除了CPU 执行状态:获取到了所有资源包括CPU,进程处于运行状态 阻塞状态:程序停滞不在运行,放弃CPU,进程此时处于内存里 什么叫进程? 正在运行的程序 有代码段,数据段,PCB(进程控制块) 进程是资源分配的基本单位. 进程之间能不能直接通信? 正常情况下,多进程之间是无法进行通信的.因为每个进程都有自己独立的空间 锁: 为了多进程通信时,保