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

news/2024/7/27 8:48:37/文章来源:https://blog.csdn.net/2201_75392588/article/details/136470458

有名信号量

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.luyixian.cn/news_show_997342.aspx

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

相关文章

Hololens 2应用开发系列(2)——MRTK基础知识及配置文件配置(上)

Hololens 2应用开发系列&#xff08;2&#xff09;——MRTK基础知识及配置文件配置 一、前言二、MRTK基础知识2.1 MRTK概述2.2 MRTK运行逻辑2.3 MRTK配置文件介绍2.4 MRTK服务 三、配置文件使用3.1 总配置文件3.2 相机配置3.3 其他配置 参考文献 一、前言 在前面的文章中&…

有一点好看的wordpress外贸独立站模板

手机配件wordpress外贸网站模板 充电器、移动电源、手机膜、手机电池、手机壳、手机转接头等手机配件wordpress外贸网站模板。 https://www.jianzhanpress.com/?p3809 车载电器wordpress外贸网站模板 车载吸尘器、空气净化器、行车记录仪、车载充电器、车载影音导航等车载电…

两数之和(c++ 、c)

给定一个整数数组nums和一个整数目标值target&#xff0c;请你再该数组中找出和为目标值target的那两个数&#xff0c;并返回它们的数组下标 题目介绍方法一思路及算法复杂度分析 方法二&#xff1a;哈希表什么是哈希表思路及算法C中unordered_map用法复杂度分析 方法三&#x…

C++ STL自定义排序

更具体的看【速记】C STL自定义排序 - 知乎 (zhihu.com) sort sort第三个位置放的greater<int>和less<int>萌新可能会弄错&#xff0c;这两个单词不是更大和更小的意思&#xff0c;而是大于和小于&#xff0c;并且比较就是自定义排序中的前者和后者。 如果是less…

【CSP试题回顾】201503-3-节日

CSP-201503-3-节日 关键点&#xff1a;格式化输出 在C中&#xff0c;格式化输出通常利用iostream库中的功能&#xff0c;特别是iomanip头文件提供的一系列操作符。这些操作符用于控制输出格式&#xff0c;如宽度、填充、对齐方式等。在你提供的代码中&#xff0c;用于格式化输…

电脑要用多少V的电源?电脑电源输入电压是市电

台式电源的输出电压是多少&#xff1f; 电脑电源输出一般有三种不同的电压&#xff0c;分别是&#xff1a; 12V、5V、3.3V。 电脑电源负责给电脑配件供电&#xff0c;如CPU、主板、内存条、硬盘、显卡等&#xff0c;是电脑的重要组成部分。 工作电流根据不同的硬件及其使用状…

Linux 开发工具 yum、git、gdb

目录 一、yum 1、软件包 2、rzsz 3、注意事项 4、查看软件包 5、安装软件 6、卸载软件 二、git操作 1、克隆三板斧 2、第一次使用会出现以下情况&#xff1a; 未配置用户名和邮箱&#xff1a; push后弹出提示 三、gdb使用 1、背景 2、使用方法 例一&#xff1a…

根据标准化开发流程---解析LIN总线脉冲唤醒的测试方法和用例设计思路

前言&#xff1a;本文从标准化开发流程的角度&#xff0c;以LIN总线脉冲唤醒为切入点。从测试工程师的角度来讲测试工作应当如何展开&#xff08;结合我干测试总结出来的测试经验&#xff09;。希望大家都能从中有收获&#xff01;&#xff01;谢谢&#xff01;&#xff01; 1…

设计模式(十三)抽象工厂模式

请直接看原文:设计模式&#xff08;十三&#xff09;抽象工厂模式_抽象工厂模式告诉我们,要针对接口而不是实现进行设计。( )-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- …

Android 消息恢复 - 如何在 Android 上检索已删除的短信

最新调查显示&#xff0c;手机每天发送和接收的短信数以亿计&#xff0c;尤其是Android智能手机。但与此同时&#xff0c;Android消息丢失也每天都在发生。因此&#xff0c;如何恢复Android手机上已删除的短信对于那些在设备中保存了一些重要信息的人来说似乎非常重要。 在这里…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:PanGesture)

拖动手势事件&#xff0c;当滑动的最小距离超过设定的最小值时触发拖动手势事件。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 接口 PanGesture(value?: { fingers?: number; direction?: PanDir…

js--DOM树简介

DOM树将HTML文档以树状结构直管段表现出来&#xff0c;也称为节点树。 1、节点Node 节点是DOM树中的单个点&#xff0c;包括文档本身、元素、文本以及注释都属于是节点。 元素节点&#xff1a;所有的标签&#xff0c;html是根节点 属性节点&#xff1a;所有的属性 文本节点&…

基于springboot+vue的医疗挂号管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

1 数据分析概述与职业操守 (3%)

1、 EDIT数字化模型 E——exploration探索 &#xff08;是什么&#xff09; 业务运行探索&#xff1a;探索关注企业各项业务的运行状态、各项指标是否合规以及各项业务的具体数据情况等。 D——diagnosis 诊断 (为什么) 问题根源诊断&#xff1a;当业务指标偏离正常值时&…

Git保姆级使用教程

一、版本控制 1.1 团队开发问题 企业项目一般以团队形式实施开发&#xff0c;那团队开发中会出现哪些问题呢&#xff1f; 小明负责的模块就要完成了&#xff0c;就在即将Release之前的一瞬间&#xff0c;电脑突然蓝屏&#xff0c;硬盘光荣牺牲&#xff01;几个月来的努力付之…

学习统一的Hyper - network用于多模态MR图像合成和缺失模态的肿瘤分割

Learning Unified Hyper-Network for Multi-Modal MR Image Synthesis and Tumor Segmentation With Missing Modalities Learning Unified Hyper-Network for Multi-Modal MR Image Synthesis and Tumor Segmentation With Missing Modalities背景贡献实验方法多模态合成方法超…

Go的安装

一. 下载地址 Go官方下载地址&#xff1a;https://golang.org/dl/ Go中文网&#xff1a;https://go.p2hp.com/go.dev/dl/ 根据不同系统下载不同的包。 二. 配置GOPATH GOPATH是一个环境变量&#xff0c;用来表明你写的go项目的存放路径。 GOPATH路径最好只设置一个&#xff0…

Linux系统:内核参数调优

目录 1、/proc目录 2、sysctl命令 3.1 控制源路由验证 3.2 控制内核的系统请求调试功能 3.3 控制核心转储是否将PID附加到核心文件名 3.4 控制TCP同步cookie的使用 3.5 在网桥上禁用netfilter 3.6 控制消息队列的默认最大大小 3.7 调试TCP内核参数 3.8 调试套…

Docker之若依项目部署

目录 一、搭建项目的局域网 1.1搭建局域网 1.2查看局域网 1.3注意&#xff1a;要关闭防火墙&#xff0c;关闭后要重启docker 二、redis安装 2.1创建目录 2.2修改redis.conf文件 三、MySQL安装 3.1安装 3.2设置远程连接 3.3创建数据库 四、若依后端项目搭建 4.1创建…

学习经验分享【NO.21】近期中文核心期刊目标检测论文理解

前言&#xff1a;最近比较忙&#xff0c;很久没有翻看知网论文了&#xff0c;看了下yolo改进相关的论文发现基于YOLOv5改进的核心期刊论文还是层出不穷&#xff0c;并没有因为已经是2024年了YOLOv9的出现而导致论文不好发&#xff0c;同时YOLOv8的论文也出了不少&#xff0c;所…