1、使用共享内存在两个进程中传值

2、使用信号量做同步控制。

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>static int init_semvalue (int);
static void del_semvalue (int);
static int P (int);
static int V (int);//自己定义的semun结构体
union semun
{int val;struct semid_ds *buf;unsigned short *array;struct seminfo *__buf;
};int
main (int argc, char *argv[])
{int var_cri = 0;int sem_id;pid_t pid;int *num;//创建一个信号量sem_id = semget ((key_t) 2234, 1, 0666 | IPC_CREAT);//初始化一个信号量if (!init_semvalue (sem_id)){fprintf (stderr, "Failed to initialize semaphore!\n");exit (EXIT_FAILURE);}//创建子进程if ((pid = fork ()) == 0) //子进程{int shid=shmget((key_t)654321,(size_t)4, 0600|IPC_CREAT);if(shid==-1){perror("shmget");exit(EXIT_FAILURE);}num=shmat(shid, NULL,0);if(num==NULL){perror("shmat");exit(EXIT_FAILURE);}while (1){//临界区if (!P (sem_id))//申请资源exit (EXIT_FAILURE);int i;for (i = 0; i != 10; ++i){(*num)++;printf ("[child]: %d:%d\n", i,*num);sleep (1);}if (!V (sem_id))//释放资源exit (EXIT_FAILURE);}}else if (pid > 0)      //父进程{int shid=shmget((key_t)654321,(size_t)4, 0600|IPC_CREAT);if(shid==-1){perror("shmget");exit(EXIT_FAILURE);}num=shmat(shid, NULL,0);if(num==NULL){perror("shmat");exit(EXIT_FAILURE);}sleep (1);while (1){//临界区if (!P (sem_id))exit (EXIT_FAILURE);int i;for (i = 0; i != 10; ++i){(*num)++;printf ("[parent]: %d:%d\n", i,*num);sleep (1);}if (!V (sem_id))exit (EXIT_FAILURE);}sleep (8);//销毁信号量del_semvalue (sem_id);}exit (EXIT_SUCCESS);
}static int
init_semvalue (int id)
{union semun sem_union;sem_union.val = 1;if (semctl (id, 0, SETVAL, sem_union) == -1)//设置信号量集中的信号量值valuereturn (0);return (1);
}static void
del_semvalue (int id)
{union semun sem_union;if (semctl (id, 0, IPC_RMID, sem_union) == -1)//IPC——RMID将信号量集从内存中删除fprintf (stderr, "Failed to delete semaphore\n");
}int
P (int id)
{struct sembuf op;op.sem_num = 0;//单信号op.sem_op = -1;//P操作op.sem_flg = 0;if (semop (id, &op, 1) < 0)//改变key,它代表进程要使用的某个资源return 0;return 1;
}int
V (int id)
{struct sembuf op;op.sem_num = 0;op.sem_op = 1;//V操作op.sem_flg = 0;if (semop (id, &op, 1) < 0)return 0;return 1;
}

linux共享内存与信号量的使用相关推荐

  1. Linux共享内存和信号量,Linux共享内存和信号量的实例(2)

    nbsp;    //SLEEP 3秒,等待消费者进程执行完毕 printf("Poducer if over\n"); exit(0); } else { /*  消费者A进程  ...

  2. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结

    Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...

  3. Linux(信号,进程间通信)共享内存,信号量,消息队列

    信号(signal) 1.1 什么是信号? 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式 1.2 信号的来源 硬件 [1] 用户在终端按下某些键时,终端驱动程序会发送信号给前台进程 ct ...

  4. linux 共享内存 查看和删除

    在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误.您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法. 预备知识 L ...

  5. 进程间通信之分别用共享内存和信号量实现卖票

    利用共享内存实现的卖票系统: 利用flag来保证同一时间只有一个程序使用内存,使用结束还原. #include <stdio.h> #include <sys/ipc.h> # ...

  6. linux如何看分配固定共享内存段,Linux共享内存的查看和删除

    在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误.您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法. 预备知识 L ...

  7. linux的共享内存,linux共享内存实际在哪里?

    我只想知道共享内存驻留在Linux系统中的位置?它在物理内存还是虚拟内存中?linux共享内存实际在哪里? 我知道有关进程的虚拟内存发送信箱,他们从不同的工艺处理和流程没有看到对方的记忆,但我们可以利 ...

  8. php多进程共享数据库,PHP多进程环境下通过共享内存与信号量实现资源共享

    PHP多进程环境下通过共享内存与信号量实现资源共享 目前工作环境,由于一些原因,不能使用swoole,和其他多进程的管理组件.但是项目中有大量的功能必须通过多进程来实现.面对这也不能,那也不能的困境, ...

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

    1.概念 不同进程看到共同区域 2.特点 (1)是进程间通信最快的方式,对不同内存的映射(少了两次拷贝) (2)不提供任何同步互斥机制,也不自己维护 (3)接口简单 3.通信方式 由文件系统提供--管 ...

最新文章

  1. 笛卡尔积 php,PHP自定义函数生成笛卡尔积
  2. Linux系统查看系统是32位还是64位方法总结 in 创新实训
  3. Python应用实战案例-Python使用MODIS数据实现温度植被干旱指数TVDI的计算
  4. 【Python】简单的最优算法函数创建
  5. 基于mini2440的看门狗(裸机)
  6. Linux系统目录说明
  7. RSYNC安装使用详解
  8. nvm 下载node 下载不下来_音乐下载 黄子韬爸妈可以不走吗
  9. SoapUI接口测试-基本操作
  10. 开上帝视角,其实你也能
  11. nginx工作原理详解
  12. 【路径规划】局部路径规划算法——B样条曲线法(含python实现)
  13. ITIL4服务管理的新思路与实践案例介绍
  14. 计算机预览正常打印乱码,打印机打印文件显示乱码该怎么办?
  15. 如何自制自平衡云台基于mpu6050,arduino输出三维倾斜角度的方法(含源码,库)
  16. office表格怎么冻结前两行_office 2010下excel表格中冻结功能操作任意行的技巧
  17. 瀑布流插件WookMark
  18. 禁用wordpress新编辑器,使用经典编辑器的方法
  19. matlab求最大公倍数_matlab求最大公约数和最小公倍数
  20. 迭代阈值图像分割matlab,Matlab 图像分割 (阈值处理)

热门文章

  1. 火车头采集php源码不同,防火车头采集的功能
  2. c# 再次尝试 连接失败_和平精英ios充值失败该怎么办
  3. R语言多层桑基图_桑基图的绘制核心微生物组分类学及丰度展示
  4. SparkSQL之External Data
  5. Spark SQL 1.x之Hive Context
  6. 八、朴素贝叶斯中文分类实战
  7. 送一些豆瓣 8.9 分优质书,啃完拿下 BAT 高薪 offer 不是梦!
  8. 17 种经典图表总结,轻松玩转数据可视化!
  9. matlab的yalmip为什么这么慢,Yalmip问题请教
  10. python读文本文件的过程是怎样的_读写文本文件的步骤_Python读写txt文本文件的操作方法全解析...