Day 6.有名信号量(信号灯)、网络的相关概念和发端

有名信号量

1.创建:

semget

 int semget(key_t key, int nsems, int semflg);

功能:创建一组信号量

参数:key:IPC对像的名字

           nsems:信号量的数量

            semflg:IPC_CREAT

返回值:成功返回信号量ID
              失败返回-1

2.销毁

semctl

 int semctl(int semid, int semnum, int cmd, ...);

功能:向信号灯发送命令

参数:semid:信号等的ID

           semnum:具体操作信灯的编号

           cmd: IPC_RMID    删除信号灯
                      SETVAL      设置信号量的值

返回值:成功返回0;失败返回-1;

初始化:

union semun {
            int              val;    /* Value for SETVAL */
            struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
            unsigned short  *array;  /* Array for GETALL, SETALL */
            struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                        (Linux-specific) */
        };

3.申请信号量

4.释放信号量

semop

int semop(int semid, struct sembuf *sops, size_t nsops);

功能:对信号量完成操作

参数:semid:信号灯的ID

           sops:信号量操作的数组的首地址

           nsops:数组元素的个数

返回值:成功返回0;失败返回-1;

unsigned short sem_num;  /* semaphore number */        操作信号量的下标
         short          sem_op;   /* semaphore operation */     具体对信号量的操作(申请:-1  释放:+1)
         short          sem_flg;  /* operation flags */         SEM_UNDO

write.c

#include "head.h"int main(void)
{key_t key;int shmid = 0;char *p = NULL;int semid = 0;int val[2] = {0, 1};key = ftok(".", 'a');   //生成一个key值if (key == -1){perror("fail to ftok");return -1;}semid = semget(key, 2, IPC_CREAT | 0664);  //通过key值创建一组信号量if (semid == -1){perror("fail to semget");return -1;}init_sem(semid, val, 2);    //封装函数,对两组信号量初始化shmid = shmget(key, 4096, IPC_CREAT | 0664);    //根据这个key值创建一个共享内存空间if (shmid == -1){perror("fail to shmget");return -1;}p = (char *)shmat(shmid, NULL, 0);        //将地址p用射到共享内存空间中if (p == NULL){perror("fail to shmat");return -1;}while(1){sem_p(semid, 1);     //封装函数,释放写信号量gets(p);      //像这个内存空间中写入数据sem_v(semid, 0);     //封装函数,申请读信号量if (!strcmp(p,".quit")){break;}}shmdt(p);   //解除映射shmctl(shmid, IPC_RMID, NULL);   //删除共享内存空间return 0;
}

read.c

#include "head.h"int main(void)
{key_t key;int shmid = 0;char *p = NULL;int semid = 0;int val[2] = {0, 1};key = ftok(".", 'a');   //创建一个key值if (key == -1){perror("fail to ftok");return -1;}semid = semget(key, 2, IPC_CREAT | 0664);  //通过key值创建一组信号量if (semid == -1){perror("fail to semget");return -1;}init_sem(semid, val, 2);    //封装函数,对两组信号量初始化shmid = shmget(key, 4096, IPC_CREAT | 0664);    //根据这个key值创建一个共享内存空间if (shmid == -1){perror("fail to shmget");return -1;}p = (char *)shmat(shmid, NULL, 0);    //将地址p映射到共享内存空间中if (p == NULL){perror("fail to shmat");return -1;}while(1){sem_p(semid, 0);   //封装函数,申请以个读信号量	printf("p = %s\n",p);   //打印内存空间中的数据if (!strcmp(p,".quit"))      {break;}sem_v(semid, 1);    //封装函数,释放一个写信号量}shmdt(p);   //解除映射shmctl(shmid, IPC_RMID, NULL);         //删除共享内存空间return 0;
}

sem.c

#include "head.h"#if 0
union semun
{int val;struct semid_ds *buf;unsigned short *array;struct seminfo *__buf;
};
#endif    //这个共用体应放在头文件中/*对信号等的灯的信号量进行初始化*/
int init_sem(int semid, int *parray, int len)
{union semun myun;int i = 0;int ret = 0;for (i = 0; i < len; ++i){myun.val = parray[i];ret = semctl(semid, i, SETVAL, myun);if (ret == -1){perror("fail to semctl");return -1;}}return 0;
}/*申请信号灯的信号量*/
int sem_p(int semid, int num)
{int ret = 0;struct sembuf mybuf;mybuf.sem_num = num;mybuf.sem_op = -1;mybuf.sem_flg = SEM_UNDO;ret = semop(semid, &mybuf, 1);if (ret == -1){perror("fail to semop");return-1;}return 0;
}/*释放信号灯的信号量*/
int sem_v(int semid, int num)
{int ret = 0;struct sembuf mybuf;mybuf.sem_num = num;mybuf.sem_op = +1;mybuf.sem_flg = SEM_UNDO;ret = semop(semid, &mybuf, 1);if (ret == -1){perror("fail to semop");return-1;}return 0;
}



网络

网络:

数据传输、数据共享

1.网络协议模型:

OSI协议模型(分层模型、下一层为上一层提供服务)

应用层:实际发送的数据

表示层:发送的数据是否要加密

会话层:是否建立会话链接

传输层:数据传输的方式(数据报、流式)

网络层:数据的路由(如何从一个局域网到达另一个局域网)  依赖于IP地址

数据链路层:局域网下如何通信

物理层:物理介质的链接

TCP/IP协议模型

应用层:决定传输的数据

传输层:决定传输的法方式

网络层:数据如何从一台主机到达另一台主机

网络接口层:物理介质的链接

应用层:

HTTP        超文本传输协议

HTTPS        加密的超文本传输

FTP        文本传输协议

TFTP        简单文本传输协议

SMTP        邮件传输协议

MQTT

TELNET        

传输层:
UDP        用户数据报协议

特点:

1、实现机制简单

2、资源开销小

3、不安全不可靠

TCP        传输控制协议

特点:

1、实现机制复杂(三次挥手)

2、资源开销大

3、安全可靠(四次挥手)

网络层:
IPV4

IP地址:唯一标识网络中一台主机的标号

IP地址:网络位 + 主机位

子网掩码:用来标识IP地址的网络位和主机位

                子网掩码是1的部分表示IP地址的网络位

                子网掩码是0的部分表示IP地址的主机位

网段号:网络位不变,主机位全为0,表示网段号

广播地址:网络位不变,主机位全为1,表示广播地址

IP地址的类型:
A类

1.0.0.0-126.255.255.255

子网掩码:255.0.0.0

管理超大规模网络

私有IP地址:10.0.0.0 - 10.255.255.255 

B类

128.0.0.0-191.255.255.255

子网掩码:255.255.0.0

管理大中性规模网络

私有IP地址:172.16.0.0 - 172.31.255.255

C类

192.0.0.0-223.255.255.255

子网掩码:255.255.255.0

管理中小型规模网络

私有IP地址:192.168.0.0 - 192.168.255.255

D类

224.0.0.0-239.0.0.0

用于组播

E类

240.0.0.0-255.255.255.255

用于实验

2.UDP编程:

socket套接字编程:

1、发端:

1)socket

 int socket(int domain, int type, int protocol);

功能:创建一个用来通信的文件描述符

参数:domain:使用的协议族        AF_INET(IPV4协议族)

           type:套接字类型

                SOCK_STREAM:流式套接字
                SOCK_DGRAM:数据报套接字
                SOCK_RAW:原始套接字

             protocol:协议
                           默认为0

返回值:成功返回文件描述符;失败返回-1;

2)sendto

 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);

功能:利用套接字向指定地址发送数据信息

参数:sockfd:套接字的文件描述符

buf:发送数据空间的首地址

len:发送数据的长度

flags:属性默认位0

dest_addr:目的地址信息存放的空间首地址

addrlen:目的地址的长度

返回值:成功返回实际发送的字节数;失败返回-1;

struct sockaddr_in {
            sa_family_t    sin_family; /* address family: AF_INET */
            in_port_t      sin_port;   /* port in network byte order */
            struct in_addr sin_addr;   /* internet address */
        };

        /* Internet address. */
        struct in_addr {
            uint32_t       s_addr;     /* address in network byte order */
        };

3)inet_addr

in_addr_t inet_addr(const char *cp);

功能:将字符串IP地址类型转换成内存IP地址

4)htons

uint16_t htons(uint16_t hostshort);

功能:将本地字节序转换成网络的大端字节序

#include "head.h"int main(void)
{int sockfd = 0;struct sockaddr_in recvaddr;ssize_t nsize = 0;char tmpbuff[1024] = {0};fgets(tmpbuff, sizeof(tmpbuff), stdin);/* 创建用来通信的UDP套接字 */sockfd = socket(AF_INET, SOCK_DGRAM, 0);  //使用IPV4协议族 和数据报套接字if (-1 == sockfd){perror("fail to socket");return -1;}/* 对方接收方地址赋值 */recvaddr.sin_family = AF_INET;  //recvaddr.sin_port = htons(50000);  //recvaddr.sin_addr.s_addr = inet_addr("192.168.149.1");  ///* 发送信息 */nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff), 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr));  //if (-1 == nsize){perror("fail to sendto");return -1;}printf("成功发送%ld字节!\n",nsize);close(sockfd);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5G智能制造热力工厂数字孪生可视化平台,推进热力行业数字化转型

5G智能制造热力工厂数字孪生可视化平台&#xff0c;推进热力行业数字化转型。在当今这个信息化、数字化的时代&#xff0c;热力生产行业也迎来了转型的关键时刻。为了提升生产效率、降低成本、提高产品质量&#xff0c;越来越多的热力生产企业开始探索数字化转型之路。而5G智能…

SAP 工单CO02删除标记设置增强

需求&#xff1a;工单打上删除标记时检查&#xff0c;满足才能打上删除标记 位置&#xff1a;PPCO0002 -> EXIT_SAPLCORO_001 -》INCLUDE ZXCO1U02.中 如果没有&#xff0c;就新建 然后写下代码测试&#xff1a; MESSAGE test TYPE I. 然后就可以写下自己要的检查了&…

three.js如何实现简易3D机房?(一)基础准备-下

接上一篇&#xff1a; three.js如何实现简易3D机房&#xff1f;&#xff08;一&#xff09;基础准备-上&#xff1a;http://t.csdnimg.cn/MCrFZ 目录 四、按需引入 五、导入模型 四、按需引入 index.vue文件中 <template><div class"three-area">&l…

基于springboot+vue实现会议室预约系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现会议室预约系统演示 摘要 一个企业的发展离不开相关的规定流程。信息化到来的今天在我们的生活当中。离不开各种信息化的支持。比如钉钉会议预约、美团买菜、扫码签到等各种信息化软件。他们涉及我们生活中的方方面面给我们的生活提供了更大的便利性。大到政…

css网格布局简单介绍

前端网格布局是一种用于在网页上创建复杂网格系统的布局技术。它允许开发者通过简单的语法来定义和控制元素的排列方式&#xff0c;使得页面布局更加灵活和可预测。在CSS中&#xff0c;网格布局可以通过display: grid属性来实现。 特点 1. **灵活性**&#xff1a;网格布…

微信小程序开发系列(十一)·小程序页面的跳转设置以及参数传递

目录 1. 跳转到商品列表 1.1 url: 当前小程序内的跳转链接 1.2 navigate&#xff1a;保留当前页面&#xff0c;跳转到应用内的某个页面。但是不能跳到 tabbar 页面 1.3 redirect&#xff1a; 关闭当前页面&#xff0c;跳转到应用内的某个页面。但不能跳转到 tabbar 页面…

在 Flutter 中使用 flutter_gen 简化图像资产管理

你是否厌倦了在 Flutter 项目中手动管理图像资产的繁琐任务&#xff1f; 告别手工输入资源路径的痛苦&#xff0c;欢迎使用“Flutter Gen”高效资源管理的时代。在本文中&#xff0c;我将带您从手动处理图像资源的挫折到动态生成它们的便利。 选择1&#xff1a;痛苦手动添加–…

Jenkins如何做到parameter页面里2个参数的联动

在Jenkins中&#xff0c;参数化构建是一种非常有用的功能&#xff0c;它可以让用户在构建过程中输入参数&#xff0c;从而实现更灵活的构建流程。有时候&#xff0c;我们希望两个参数之间能够实现联动&#xff0c;即一个参数的取值会影响另一个参数的取值。要实现这样的功能&am…

ChatGPT编程省钱、方便小示例——实现PDF转成PNG文件

ChatGPT编程省钱、方便小示例——实现PDF转成PNG文件 今天登录一个网站发现一个pdf文件很漂亮&#xff0c;于是想下载下来转成png图片。 于是用wps软件打开&#xff0c;然后进行转换。。。。。。 果然天下没有免费的午餐。既然AI时代已经到来&#xff0c;那就交给无所不能的AI…

DataGrip 连接 Centos MySql失败

首先检查Mysql是否运行&#xff1a; systemctl status mysqld &#xff0c; 如果显示没有启动则需要启动mysql 检查防火墙是否打开&#xff0c;是否打开3306的端口 sudo firewall-cmd --list-all 如果下面3306没有打开则打开3306端口 publictarget: defaulticmp-block-inver…

2195. 深海机器人问题(网络流,费用流,上下界可行流,网格图模型)

活动 - AcWing 深海资源考察探险队的潜艇将到达深海的海底进行科学考察。 潜艇内有多个深海机器人。 潜艇到达深海海底后&#xff0c;深海机器人将离开潜艇向预定目标移动。 深海机器人在移动中还必须沿途采集海底生物标本。 沿途生物标本由最先遇到它的深海机器人完成采…

【自动驾驶技术系列丛书学习】1.《自动驾驶技术概论》学习笔记

《自动驾驶技术概论》学习笔记 致谢&#xff1a;作者&#xff1a;王建、徐国艳、陈竞凯、冯宗宝 -------------------------------------------------------------------------------------------------------- 笔记目录 《自动驾驶技术概论》学习笔记 1.汽车发展史 2.国…

Docker常用基础指令

目录 1 前言 2 常用指令 2.1 获取帮助 2.2 拉取镜像到本地 2.3 对本地镜像进行打包 2.4 对本地镜像的删除 2.5 通过tar包加载本地镜像 2.6 查看所有镜像 2.7 创建新的容器 2.8 查看容器 2.9 停止容器运行 2.10 运行容器 2.11 删除容器 2.12 查看容器日志 2.13 进…

如何使用 ArcGIS Pro 统计四川省各市道路长度

在某些时候&#xff0c;我们需要进行分区统计&#xff0c;如果挨个裁剪数据再统计&#xff0c;不仅步骤繁琐、耗时&#xff0c;还会产生一些多余的数据&#xff0c;这里教大家如何在不裁剪数据的情况下统计四川各市的道路长度&#xff0c;希望能对你有所帮助。 数据来源 教程…

【MySQL】视图 -- 详解

视图 是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 一、基本使用 1、创建视图 create view 视图名 as select 语句; 好处&#xff1a;…

UEFI Secure Boot

一、前言 在计算机世界&#xff0c;安全是一个永恒的话题。微软的Windows的安全性一直深受诟病&#xff0c;但随着操作系统层面的漏洞逐渐减少&#xff0c;黑客们盯上了BIOS固件。那如何保证从开机到进入操作系统这个过程中的安全呢&#xff1f;下图是Intel CPU的整个UEFI安全启…

洞察未来5-10年数字化转型的革命性趋势

“十四五”规划和2035年远景目标纲要提出了加快数字化发展&#xff0c;建设数字中国的目标&#xff0c; 这意味着数字化转型将成为推动生产方式、生活方式和治理方式变革的关键力量。 加快数字化发展 建设数字中国 ⭐ 打造数字经济新优势 ⭐ 加快数字社会建设步伐 ⭐ 提高数字…

软考62-上午题-【面向对象技术】-面向对象的基本概念1

一、封装 1-1、封装的定义 一个对象把属性和行为封装为一个整体。是一种信息隐蔽技术。 封装就是将类的某些信息隐藏在类内部&#xff0c;不允许外部程序直接访问&#xff0c;而是通过该类提供的方法&#xff08;getter和setter&#xff09;来实现对隐藏信息的操作和访问。 封…

Docker发布镜像(DockerHub,阿里云)

目录 1、发布到DockerHub上 2、发布到阿里云镜像服务上 小结 1、发布到DockerHub上 1.地址https://hub.docker.com/注册自己的账号 2.确定这个账号可以登录 3.在服务器上提交自己的镜像 [rootwq test]# docker login --helpUsage: docker login [OPTIONS] [SERVER]Log in…

数据存储格式

数据存储格式是指数据在存储介质中表示和组织的方式&#xff0c;以便于读取、写入和管理。 csv&#xff08;逗号分隔值&#xff09; CSV&#xff08;Comma-Separated Values&#xff0c;逗号分隔值&#xff09;是一种常见的数据存储格式&#xff0c;它以纯文本形式存储表格数…