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

2024-03-07 02:28

本文主要是介绍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;
}

这篇关于Day 6.有名信号量(信号灯)、网络的相关概念和发端的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/782135

相关文章

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存