IPC 共享信号量 共享内存的创建失败的原因分析 LINUX 网络编程第二版
linux 网络编程书 对于 semid = semget(key,1,IPC_CREAT|0666); /获得信号量的ID/
写错了 书里面写的是0 ,这个参数的意义代表的是,信号量的数量。
有点烦躁,为什么出书的不把书里面的程序运行一下呢?????
另外,把所有的代码的下载连接放上去
linux 网络编程源码下载
方便大家比对,
在这里致谢
http://liuzhigong.blog.163.com/blog/static/17827237520117310413419/?ignoreua
先行者,致谢。否则又要慢慢分析。
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <string.h>
typedef int sem_t;
union semun { /*信号量操作的联合结构*/
int val; /*整型变量*/
struct semid_ds *buf; /*semid_ds结构指针*/
unsigned short *array; /*数组类型*/
} arg; /*定义一个全局变量*/
sem_t CreateSem(key_t key, int value) /*建立信号量,魔数key和信号量的初始值 value*/
{
union semun sem; /*信号量结构变量*/
sem_t semid; /*信号量ID*/
sem.val = value; /*设置初始值*/
semid = semget(key,1,IPC_CREAT|0666); /*获得信号量的ID*/
if (-1 == semid) /*获得信号量ID失败*/
{
printf("create semaphore error%d\n",errno);/*打印信息*/
return -1; /*返回错误*/
}
semctl(semid,0,SETVAL,sem); /*发送命令,建立value个初始值的信号量*/
return semid; /*返回建立的信号量*/
}
int Sem_P(sem_t semid) /*增加信号量*/
{
struct sembuf sops={0,+1,IPC_NOWAIT}; /*建立信号量结构值*/
return (semop(semid,&sops,1)); /*发送命令*/
}
int Sem_V(sem_t semid) /*减小信号量值*/
{
struct sembuf sops={0,-1,IPC_NOWAIT}; /*建立信号量结构值*/
return (semop(semid,&sops,1)); /*发送信号量操作方法*/
}
#if 0
typedef int sem_t;
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
}arg;
sem_t CreateSem(key_t key, int value)
{
union semun sem;
sem_t semid;
sem.val = value;
semid = semget(key,0,IPC_CREAT|0666);
if(-1 == semid)
{
printf("create semaphore error:errno %d\n",errno);
return -1;
}
semctl(semid,0,SETVAL,sem);
return semid;
}
int Sem_P(sem_t semid)
{
struct sembuf sops={0,+1,IPC_NOWAIT};
return (semop(semid,&sops,1));
}
int Sem_V(sem_t semid)
{
struct sembuf sops={0,-1,IPC_NOWAIT};
return (semop(semid,&sops,1));
}
#endif
void DestroySem(sem_t semid)
{
union semun sem;
sem.val = 0;
semctl(semid,0,IPC_RMID,sem);
}
#if 0
static char msg[] = "你好,共享内存";
int main(void)
{
key_t key;
int semid,shmid;
char i,*shms,*shmc;
struct shmid_ds buf;
int value = 0;
char buffer[80];
pid_t p;
key = ftok("/ipc/sem",'c');
shmid = shmget(key,1024,IPC_CREAT|0604);
semid = CreateSem(key,0);
p = fork();
if(p>0)
{
shms = (char *)shmat(shmid,0,0);
memcpy(shms, msg, strlen(msg)+1);
sleep(10);
Sem_P(semid);
shmdt(shms);
DestorySem(semid);
}
else if(p == 0)
{
shmc = (char *)shmat(shmid,0,0);
Sem_V(semid);
printf("共享内存的值为:%s\n",shmc);
shmdt(shmc);
}
return 0;
}
#endif
static char msg[]="你好,共享内存\n";
int main(void)
{
key_t key;
int semid,shmid;
char i,*shms,*shmc;
struct semid_ds buf;
int value = 0;
char buffer[80];
pid_t p;
key = ftok("/ipc/sem",'R'); /*生成键值*/
shmid = shmget(key,1024,IPC_CREAT|0604); /*获得共享内存,大小为1024个 字节*/
semid = CreateSem(key,0); /*建立信号量*/
p = fork(); /*分叉程序*/
if(p > 0) /*父进程*/
{
shms = (char *)shmat(shmid,0,0); /*挂接共享内存*/
memcpy(shms, msg, strlen(msg)+1); /*复制内容*/
sleep(10); /*等待10s,另一个进程将数据读 出*/
Sem_P(semid); /*获得共享内存的信号量*/
shmdt(shms); /*摘除共享内存*/
DestroySem(semid); /*销毁信号量*/
}
else if(p == 0) /*子进程*/
{
shmc = (char *)shmat(shmid,0,0); /*挂接共享内存*/
Sem_V(semid); /*减小信号量*/
printf("共享内存的值为:%s\n",shmc); /*打印信息*/
shmdt(shmc); /*摘除共享内存*/
}
return 0;
}
IPC 共享信号量 共享内存的创建失败的原因分析 LINUX 网络编程第二版的更多相关文章
- ThreadLocal内存溢出代码演示和原因分析!
ThreadLocal 翻译成中文是线程本地变量的意思,也就是说它是线程中的私有变量,每个线程只能操作自己的私有变量,所以不会造成线程不安全的问题. 线程不安全是指,多个线程在同一时刻对同一个全局 ...
- linux下使用crontab实现定时PHP计划任务失败的原因分析
这篇文章主要介绍了linux下使用crontab实现定时PHP计划任务失败的原因分析,需要的朋友可以参考下 很多人在linux下使用crontab实现PHP执行定时任务却未能成功,不能生成缓存.本 ...
- linux网络编程-posix信号量与互斥锁(39)
-posix信号量信号量 是打开一个有名的信号量 sem_init是打开一个无名的信号量,无名信号量的销毁用sem_destroy sem_wait和sem_post是对信号量进行pv操作,既可以使用 ...
- Linux 网络编程二(Socket创建)
TCP通信 一个程序使用套接字需要执行4个步骤. --分配套接口和初始化 --连接 --发送或接收数据 --关闭套接字 涉及到的调用包括socket.bind.listen.connect(阻塞线程) ...
- linux网络编程之共享内存介绍
今天是个好日子,洋人之节乃全球同庆,圣诞一来感觉就要过年了,不过今晚心情有点打折扣,给心爱的人打电话没有打通,本想在平安夜送上快乐的祝福给她,糟糕的心情让自己好像泄了气的皮球一样,无精打彩,心情灰暗, ...
- Activiti系列:带有serviceTask的或者定时启动任务的流程部署失败的原因分析
在将两个带有serviceTask任务的流程部署到数据库的时候发现无法导入,最终分析出如下问题: 1)流程1是打算让定时启动事件可以每小时触发一次 由于原来是用 R/2015-11-01T01:00: ...
- go vendor 安装失败的原因分析
安装之前的配置 export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin 1 2 安装 通常,我们查到的安装方法一般是下面这种 go get -u gi ...
- 关于在Java中链接SQLServer数据库中失败的原因分析
首先声明:笔者是Java的初学者,并且一值是走在自学的道路上,长久以来只有“度娘”相伴.(加入了各种Java学习群,基本没有热心帮人解决问题的.可以理解-_-!!!)大神级的人物就不必看拙文了,没有什 ...
- Android 4.X 系统加载 so 失败的原因分析
1 so 加载过程 so 加载的过程可以参考小米的系统工程师的文章loadLibrary动态库加载过程分析 2 问题分析 2.1 问题 年前项目里新加了一个 so库,但发现native 方法的找不到的 ...
- Linux 网络编程详解二(socket创建流程、多进程版)
netstat -na | grep " --查看TCP/IP协议连接状态 //socket编程提高版--服务器 #include <stdio.h> #include < ...
随机推荐
- 信息资源管理综合题之“LJ集团的知识库和员工离职客户流失问题”
一.集团是北京的一家规模巨大的房地产投资公司,早在15年前,该公司出现了如下几个问题:每个业务员手上的客户资料,其他人无法得知,从而导致员工离职时会流失大量潜在客户:业务员繁忙的时候,无法满足客户用户 ...
- 信息资源管理文字题之“IT服务管理的理念以及ITIL管理体系中IT服务十大核心流程”
一.阐述IT服务管理的理念以及ITIL(信息技术基础架构库)管理体系中IT服务十大核心流程 二.答案 答:IT服务管理的理念是:以流程为导向,以客户为中心 ITIL标准中归纳了两大类核心流程:服务支持 ...
- IDEA问题之“调整IDEA字体大小”
调整IDEA字体大小 1.正常版 2. 远程版
- Helm课程资料
第一章.helm介绍.组件.安装和目录结构 1.helm3课程简介 helm3课程简介第一章.helm介绍.组件.安装和目录结构第二章.编写一个chart和helm内置对象详解第三章.helm3常 ...
- vue3 基础-条件渲染 v-if 和 v-show
本篇讲 vue 中对 dom 元素节点进行 "显示和隐藏" 的实现方式指令, 即 v-if 和 v-show. 其实一句话就能说明白, v-if 的底层是从 dom 树中增删节点; ...
- Python 深拷贝 vs 浅拷贝
在一些业务场景中, 有时候我们需要复制一个对象, 但是又不想对原来的对象产生影响, 就想搞个 副本 来为所欲为地操作嘛. 但是呢, 在 Python中呢, 又不能通过 赋值 的方式达到效果, 为啥呢? ...
- Dify 架构全景:从模块设计到部署实践的完整指南
项目概述 Dify 是一个开源的 LLM 应用开发平台,提供直观的界面,结合了AI Agent工作流.RAG 管道.智能体能力.模型管理和可观察性功能等,使用户能够快速从原型转向生产环境.Dify 允 ...
- JAVA 24 环境安装与配置
JAVA 24 环境安装与配置 一.Java Downloads Java 下载(Windows x64) https://www.oracle.com/java/technologies/downl ...
- DevEco重大更新快来体验吧
HarmonyOS首个api17 release已经正式发布了.这次的更新DevEco增加了很多重大特性,系统能力也有所增强.DevEco现在支持创建api17的应用了,模拟器也首次支持阔折叠手机以及 ...
- [虚拟化/云原生] Kubernetes 安装部署指南
1 Kubernetes 安装部署指南 1.1 前置工作与注意事项 IP Role Hostname Remark 172.16.1.72 master 和 node k8s-master-1 资源有 ...