UnixC第十一天

回忆昨天内容
一、信号阻塞
    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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值