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 网络编程第二版的更多相关文章

  1. ThreadLocal内存溢出代码演示和原因分析!

    ThreadLocal 翻译成中文是线程本地变量的意思,也就是说它是线程中的私有变量,每个线程只能操作自己的私有变量,所以不会造成线程不安全的问题. ​ 线程不安全是指,多个线程在同一时刻对同一个全局 ...

  2. linux下使用crontab实现定时PHP计划任务失败的原因分析

    这篇文章主要介绍了linux下使用crontab实现定时PHP计划任务失败的原因分析,需要的朋友可以参考下   很多人在linux下使用crontab实现PHP执行定时任务却未能成功,不能生成缓存.本 ...

  3. linux网络编程-posix信号量与互斥锁(39)

    -posix信号量信号量 是打开一个有名的信号量 sem_init是打开一个无名的信号量,无名信号量的销毁用sem_destroy sem_wait和sem_post是对信号量进行pv操作,既可以使用 ...

  4. Linux 网络编程二(Socket创建)

    TCP通信 一个程序使用套接字需要执行4个步骤. --分配套接口和初始化 --连接 --发送或接收数据 --关闭套接字 涉及到的调用包括socket.bind.listen.connect(阻塞线程) ...

  5. linux网络编程之共享内存介绍

    今天是个好日子,洋人之节乃全球同庆,圣诞一来感觉就要过年了,不过今晚心情有点打折扣,给心爱的人打电话没有打通,本想在平安夜送上快乐的祝福给她,糟糕的心情让自己好像泄了气的皮球一样,无精打彩,心情灰暗, ...

  6. Activiti系列:带有serviceTask的或者定时启动任务的流程部署失败的原因分析

    在将两个带有serviceTask任务的流程部署到数据库的时候发现无法导入,最终分析出如下问题: 1)流程1是打算让定时启动事件可以每小时触发一次 由于原来是用 R/2015-11-01T01:00: ...

  7. go vendor 安装失败的原因分析

    安装之前的配置 export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin 1 2 安装 通常,我们查到的安装方法一般是下面这种 go get -u gi ...

  8. 关于在Java中链接SQLServer数据库中失败的原因分析

    首先声明:笔者是Java的初学者,并且一值是走在自学的道路上,长久以来只有“度娘”相伴.(加入了各种Java学习群,基本没有热心帮人解决问题的.可以理解-_-!!!)大神级的人物就不必看拙文了,没有什 ...

  9. Android 4.X 系统加载 so 失败的原因分析

    1 so 加载过程 so 加载的过程可以参考小米的系统工程师的文章loadLibrary动态库加载过程分析 2 问题分析 2.1 问题 年前项目里新加了一个 so库,但发现native 方法的找不到的 ...

  10. Linux 网络编程详解二(socket创建流程、多进程版)

    netstat -na | grep " --查看TCP/IP协议连接状态 //socket编程提高版--服务器 #include <stdio.h> #include < ...

随机推荐

  1. SpringMvc怎么样把数据带给页面

    例子. /** * SpringMVC除过在方法上传入原生的request和session外还能怎么样把数据带给页面 * * 1).可以在方法处传入Map.或者Model或者ModelMap. * 给 ...

  2. eolinker校验规则之 Json Path定位:返回值内有多项同类参数,检验其中一个参数值

    比如创建商品后,查询商品是否生成,执行完创建商品接口后就需要再执行查询商品接口. 查询接口查询出来的数据可能包括所有商品数据或者有同名商品数据,所有整个返回结果内可能包含多个同名不同商品id的数据 往 ...

  3. 小结.NET 9性能优化黑科技:从内存管理到Web性能的最全指南

    引言:性能优化的重要性与 .NET 9 的性能提升 ❝ 性能优化不仅关乎代码执行效率,还直接影响用户满意度和系统可扩展性.例如,一个响应缓慢的 Web 应用可能导致用户流失,而一个内存占用过高的服务可 ...

  4. 邮件自动回复助手(Rasa/SMTP)实现教程

    在现代办公场景中,处理大量邮件是一项既耗时又容易出错的任务.为了提升工作效率,我们可以利用自然语言处理(NLP)和邮件传输协议(SMTP)技术,构建一个智能的邮件自动回复助手.本文将详细介绍如何使用P ...

  5. Innodb快速复习

    放一张官方架构图: 参考文章: 一文带你了解MySQL之InnoDB_Buffer_Pool-阿里云开发者社区这一篇buffer pool讲解的很好 [动画演示:MySQL的BufferPool和Ch ...

  6. final year project:C++手写numpy并移植到RISC-V上——纪念我在中科院实习的日子

      我毕设做的项目是用C++去实现一个Numpy,因为我是大数据专业,Numpy又是跟数据分析有关的工具,所以我打算自己动手去实现一个小型的Numpy,目前代码规模大概在六千多行左右,并且可以成功移植 ...

  7. dom绑定事件操作

    s7.html <!DOCTYPE html><html lang="en"><head>    <meta charset=" ...

  8. MCP与华为云CSE珠联璧合,打造AI时代微服务生态引擎

    本文分享自华为云社区<MCP与华为云CSE珠联璧合,打造AI时代微服务生态引擎>,作者:华为云社区精选 从 AI 技术的"火热概念"到"实际业务的落地&quo ...

  9. 玩转C++11多线程:让你的程序飞起来的std::thread终极指南

    大家好,我是小康. 你还在为 C++ 多线程编程发愁吗?别担心,今天咱们就用大白话彻底搞定std::thread!看完这篇,保证你对C++11多线程的理解从"一脸懵逼"变成&quo ...

  10. Solon AI 正试发布(支持 java8+,RAG,MCP)

    Solon AI 正试发布了(版号,随 Solon v3.3.1).历时小半年. 1.简介 Solon AI 是一个 Java AI(智能体) 全场景应用开发框架,提供有丰富的接口能力.主要支持的的智 ...