linux系统编程

1.共享内存

     共享内存(Shared Memory)是一种进程间通信(Inter-Process Communication, IPC)机制,允许多个进程共享同一段内存区域。它是实现进程间高效数据交换的一种方式。

    1.共享内存的特点

       高效性、同步机制、内存映射、系统资源、跨进程访问、内存管理、灵活性、安全性。

     2.共享内存的原理

         1.内存映射  2.操作系统支持 3.同步机制 4.生命周期管理

     3、申请对象:shmget()

         

          功能:  使用唯一键值key向内核提出共享内存使用申请

          参数:key   唯一键值
                  size  要申请的共享内存大小

                  shmflg 申请的共享内存访问权限,八进制表示,如果是第一个申请,则用IPCCREAT,如           果要检测是否存在,用IPCEXCL

      返回值:
                 成功 返回共享内存id  失败  -1

       shmat()  //将指定shmid对应的共享内存映射到本地内存。

       shmdt()   //将本地内存与共享内存断开映射关系.

       shmctl()   // 修改共享内存属性,也可以删除指定的共享内存对象。

#include<stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include<sys/shm.h>
#include<signal.h>
#include<string.h>
int main(int argc,char *argv[])
{
    key_t key = ftok("/",'B');
    if(-1 == key)
    {
        perror("ftok fail");
        return -1;
    }
    printf("key = %d\n",key);
    int shmid = shmget(key,1024,IPC_CREAT|0666);
    if(-1 == shmid)
    {
        perror("shmget fail");
        return -1;
    }
    printf("shmid = %d\n",shmid);
    void *p = shmat(shmid,NULL,0);
    if(p == (void *) -1)
    {
        perror("shmat fail");
        return -1;  
    }
    int *q = p;
    pid_t pid = *q;
    while(1)
    {
        char *s = p;
        fgets(s,sizeof(s),stdin);
        kill(pid,SIGUSR1);
        if(strncmp(s,"quit",4) == 0)
        {
            break;
        }
    }
    if(shmdt(p) < 0)
    {
        perror("shmdt fail");
        return -1;
    }
    if(shmctl(shmid,IPC_RMID,NULL) < 0)
    {
        perror("shmctl fail");
        return -1;
    }
    return 0;
}

2.tcp  特点     可靠性    有连接

   udp 特点      高效性    无连接

osi参考模型

IP               //用来标识网络中的一台主句 ---- 通过ip可以找到对应一台主机
端口号       //用来表示主机中某一个具体(进行网络通信)进程 
 ip地址的组成:
      网络号 + 主机号 
      网络号 ---表示所处的网络 
      主机号 ---表示能容纳的主机

socket    //1.一种特殊的文件 --- 专门用于网络通信(不同主机间的进程)

socket()    //程序向内核提出创建一个基于内存的套接字描述符 

sendto()  //发送数据

 端口号:  tcp 和udp 的端口号是独立的
    (1) 
       作用:唯一的标识一个进程
       每一个应用程序进程有一个端口号,
       通讯时区分数据包属于哪个应用程序进程

recvfrom()     接收数据

bind()       :如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接口地址关联,用于从该接口接受数据。

tcp 客户端:
1.建立连接
socket       
connect       //该函数固定有客户端使用,表示从当前主机向目标 主机发起链接请求。
....
2.通信过程 
read 
write 
close 

tcp服务器:
1.建立连接 
socket  
bind    
listen  //监听 客户端的连接请求 
accept  //接听 ---这一步完成之后 连接就建立好了,之后就可以收发数据  
..... 
2.通信过程 
read 
write 
close 
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值