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 < ...
随机推荐
- Cpu 资源占用高排查
查看java进程 ps aux | grep java 或者 ps -ef | grep java 查看java进程 线程信息 使用top -p [PID] -H 观察该进程中所有线程的资源占用 to ...
- 海康摄像头SDK在Linux、windows下的兼容问题
零.前言 最近一直在做人脸识别相关的应用. 主要就是使用海康的摄像头抓拍.录制视频,使用虹软的sdk进行人脸识别,使用jna调用这些sdk. 海康的sdk在使用时遭遇了很多问题,主要问题就是windo ...
- JuiceFS v1.3-beta1:新增 Python SDK,特定场景性能 3 倍于 FUSE
在当前众多 AI 和数据科学应用中,Python 已成为最主流的编程语言之一.为了方便用户在这些场景中更高效地使用 JuiceFS,我们在社区版 v1.3 中推出了 JuiceFS Python SD ...
- 无列名注入_2 [GYCTF2020]Ezsqli 1
无列名注入_2 在之前,我们使用了select `1` from (select 1,2 union select * from tableX)a这样一个形式来进行无列名注入,原理可以看我之前写的(抄 ...
- 一定要看到花开-M1下的环境噩梦
一定要看到花开-M1下的环境噩梦 人有时候就是喜欢犯贱. 关注我这快小一年的扯闲天的都知道,自己也算是经历了一劫吧.虽然,这劫难还不能说结束,但也算是走出来了. 一切,似乎正在朝着好的方向发展. 但是 ...
- 基于 SSE、asp.net core razor 实现比分Live
前言 最近在项目中用到了 SSE (Server-Sent Events),用于服务的单向长连接数据推送.因为都是使用 C# 实现的,所以服务端使用的是 HttpListener ,而客户端更简单,只 ...
- golang遍历处理map时的常见性能陷阱
最近一直在重构优化老系统,所以性能优化相关的文章会比较多. 这次的是有关循环处理map时的性能优化.预分配内存之类的大家都知道的就不多说了,今天来讲点大伙不知道的. 要讲的一共有三点,而且都和循环处理 ...
- linux安全基线自查手册
1.Redhat/CentOS 7.x配置模板 1.1 帐号管理 1.1.1 检查是否设置除root之外UID为0的用户 严重级别:中危 理论依据:任何UID为0的帐户都具有系统上的超级用户特权,只有 ...
- CSP2020复赛前小结
今天用windows下的GUIDE打了一些板子,以下是我遇到的问题. 语言 未定义返回值类型的函数 inline isnum(char ch) { return ch>='0'&& ...
- 2023人形全能赛v831代码(包括YOLOv2识别和扫码以及颜色识别)
v831 import time, math from maix import nn, camera, display, image import serial class YOLOv2: def _ ...