进程的心跳

心跳的结构体,共享内存的地址空间

处理退出信号 --->获取/创建共享内存 --->将共享内存连接到当前进程地址空间---> 列出共享内存全部进程信息便于调试  --->将当前信息填充到结构体中 ---> 把当前进程结构体保存到共享内存中  

shmat函数

该函数用于把共享内存连接到当前进程的地址空间。

void *shmat(int shmid, const void *shmaddr, int shmflg);

shmid        shmget()函数返回的共享内存标识。

shmaddr   指定共享内存连接到当前进程中的地址位置,通常填0,表示让系统来选择共享内存的地址。

shmflg       标志位,通常填0。

调用成功时返回共享内存起始地址,失败返回(void*)-1

void* 类型可以指向任何数据类型,因此允许程序员将共享内存段视作任意类型的内存块,从而方便对其进行读写操作

创建/获取共享内存

if ( (m_shmid = shmget((key_t)0x5095, 1000*sizeof(struct stprocinfo), 0666|IPC_CREAT)) == -1)
    { 
        printf("创建/获取共享内存(%x)失败。\n",0x5095); return -1; 
    }
  • 为了确保传递的数据类型是正确的,转换为key_t可以避免潜在的类型不匹配问题。
  • 虽然在很多实现中,key_t可能和int是一样的,但显式地转换为key_t可以增强代码的可读性和移植性。
  • %xprintf函数中的格式说明符,用于以十六进制形式输出整数。它会将整数转换为十六进制格式并打印出来
  • 代码中使用了return -1而不是exit(0)来处理创建共享内存失败的情况。这里的理由如下:

  • return -1:返回-1通常表示函数执行失败,尤其是在主函数main()中返回-1会向操作系统指示程序的运行结果是失败的状态。它允许程序在发生错误时以非零状态退出,并可以被操作系统或调用程序检测到。
  • exit(0)exit(0)表示正常退出程序。当调用exit(0)时,程序会被认为成功完成,不会将错误状态传递给操作系统。对于失败情况,exit(0)是不合适的,因为它会掩盖错误发生的事实。

把当前进程结构体保存到共享内存中

进程id是循环使用的,如果曾经有一个进程异常退出,没有清理自己的心跳信息, 它的进程信息将残留在共享内存中,不巧的是,如果当前进程重用了它的id,所以,如果共享内存中已存在当前进程编号,一定是其它进程残留的信息,当前进程应该重用这个位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值