心跳的结构体,共享内存的地址空间
处理退出信号 --->获取/创建共享内存 --->将共享内存连接到当前进程地址空间---> 列出共享内存全部进程信息便于调试 --->将当前信息填充到结构体中 ---> 把当前进程结构体保存到共享内存中
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
可以增强代码的可读性和移植性。 %x
是printf
函数中的格式说明符,用于以十六进制形式输出整数。它会将整数转换为十六进制格式并打印出来-
代码中使用了
return -1
而不是exit(0)
来处理创建共享内存失败的情况。这里的理由如下: r
eturn -1
:返回-1通常表示函数执行失败,尤其是在主函数main()
中返回-1会向操作系统指示程序的运行结果是失败的状态。它允许程序在发生错误时以非零状态退出,并可以被操作系统或调用程序检测到。exit(0)
:exit(0)
表示正常退出程序。当调用exit(0)
时,程序会被认为成功完成,不会将错误状态传递给操作系统。对于失败情况,exit(0)
是不合适的,因为它会掩盖错误发生的事实。
把当前进程结构体保存到共享内存中
进程id是循环使用的,如果曾经有一个进程异常退出,没有清理自己的心跳信息, 它的进程信息将残留在共享内存中,不巧的是,如果当前进程重用了它的id,所以,如果共享内存中已存在当前进程编号,一定是其它进程残留的信息,当前进程应该重用这个位置