回忆昨天内容
一、信号阻塞
sigprocmask(2) sigset_t
信号阻塞和信号忽略的区别
可靠信号 不可靠
信号丢失
二、获取进程的未决信号集
从未决信号集中找未决信号
sigpending(2)
什么是未决信号?
三、信号从产生到处理的整个过程
四、system v ipc
消息队列
获取一个system v 的key值 ftok(3)
消息队列
使用key值获取消息队列的id msgget(2)
使用消息队列的id从消息队列获取消息 或者向消息队列发送消息
caller define
struct msgbuf{
long mtype;
char mtext[];
}
消息的类型 mtype
接收 msgrcv (2) 拷贝 移除
发送 msgsnd (2)
查看消息 ipcs命令
共享内存
信号量集
今天的内容:
一、共享内存
使用键值获取共享内存的id
shmget(2)
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
功能:分配一个共享内存段
参数: key ftok(3)的值
size 指定了共享内存段的大小
shmflg
IPC_CREAT
IPC_EXCL
mode指定了共享内存段的权限
返回值: 成功 返回共享内存段的id
失败 -1 errno被设置
编写代码获取一个共享内存的id 代码参见 shmget.c
将共享内存段关联到进程的虚拟地址空间
shmat(2) shmdt(2)
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:将共享内存段附加到进程虚拟地址空间
参数:
shmid 指定了要操作的共享内存段的id
shmaddr 附加到进程虚拟地址的地址 NULL
shmflg 0
返回值:成功 返回进程的虚拟地址 共享内存段附加的地址
错误 (void*) -1 errno被设置
int shmdt(const void *shmaddr);
功能:解除关联
参数:
shmaddr 指定了共享内存段在进程的附加地址
返回值:成功 0
错误 -1 errno被设置
举例说明 使用共享内存段实现进程间的通讯
pa.c 向共享内存段写入数据
pb.c 从共享内存段读取数据
二、网络基础
客户端 服务器
什么是服务器?
软件与硬件的结合 器 硬件
服务 软件
网络通讯中采用了TCP/IP协议簇
一组的规则
TCP/IP协议分为几层?
四层或者五层 七层是osi参考模型
应用层 传输层 网络层 链路层 (物理层)
电气规定 协议 物理层
链路层 网帧
如何查看本机的ip地址和mac地址?
sudo ifconfig
ip地址(逻辑地址 4个字节) mac地址(物理地址 6个字节)
127.0.0.1 本机环回地址 用来测试网络设备工作是不是正常。
ip地址 进程监听的端口
0~65533
1024 以下不要使用
ip地址 有两部分组成 网络部分 主机部分
子网掩码
172.168.1.129
255.255.255.0
172.168.1.129/24 子网掩码前24位全1 与网段做与运算为网络号
172.168.1.0 0~255 全0不能用 网络号 全1不能用 本网段的广播地址
172.168.1.129/25
255.255.255.128
172.168.1.128 是网络号 最多126台主机
172.168.1.126/25
172.168.1.0 网络号
子网掩0码&(与运算)IP地址=网络标识 (网络号)
如果网络标识一样,那么属于同一网段
集线器 只是对电流放大 分用 物理层
交换机 交换的是网帧 链路层
路由器 交换的是ip报文 网络层
测试自己的设备是否正常
ping 127.0.0.1
ping 目标ip
数据的传输
跨网段数据的传输
局域网内部数据的传输
每台机器都有自己的路由表。
route
每台机器还有自己的arp表
arp -a
三 基于tcp的编程模型
TCP UDP
TCP比较安全可靠的传输 传输数据之前需要建立连接。开销比较大。传输效率就比较低。
UDP 不需要建立连接,象发送快递一样。
面向数据包的 不可靠的 传输效率很高。
所谓的可靠和不可靠是相对的。
客户端和服务器端的连接。
建立连接的过程。
pa.c
//pa.c
#include<t_stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<string.h>
int main(int argc,char *argv[]){
//获取键值
key_t key=ftok(".",77);
if(key==-1) E_MSG("ftok",-1);
printf("key:0x%x\n",key);
//使用键值获取一个共享内存的id
int a=shmget(key,256,IPC_CREAT|0644);
if(a==-1) E_MSG("shmget",-1);
printf("id=%d\n",a);
//将共享内存段附加到当前进程
void *p= shmat(a,NULL,0);
if(p==(void*)-1) E_MSG("SHMAT",-1);
strcpy(p,argv[1]);
//解除共享内存段和当前进程的关联
shmdt(p);
return 0;
}
会发生段错误 segmentation fault
pb.c
#include<t_stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#include<string.h>
int main(int argc,char *argv[]){
//获取键值
key_t key=ftok(".",77);
if(key==-1) E_MSG("ftok",-1);
printf("key:0x%x\n",key);
//使用键值获取一个共享内存的id
int a=shmget(key,256,IPC_CREAT|0644);
if(a==-1) E_MSG("shmget",-1);
printf("id=%d\n",a);
//将共享内存段附加到当前进程
void *p= shmat(a,NULL,0);
if(p==(void*)-1) E_MSG("SHMAT",-1);
printf("%s\n",(char *)p);
//解除共享内存段和当前进程的关联
shmdt(p);
return 0;
}
shmget.c
#include<t_stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
int main(int argc,char *argv[]){
key_t key=ftok(argv[1],77);
if(key==-1) E_MSG("ftok",-1);
printf("key:0x%x\n",key);
int a=shmget(key,256,IPC_CREAT|0644);
if(a==-1) E_MSG("shmget",-1);
printf("id=%d\n",a);
return 0;
}