0

我目前正在编写一个网络服务器,以更好地了解进程和进程间通信。当请求文件时,我将其锁定以确保在读/写期间文件没有更改。这很好用。我的问题是如何在守护进程完成执行后从内存中清除锁定。我知道信号量在创建它们的进程停止执行后仍然存在。我知道信号量的丢弃需要在父级中完成,但是,信号量是在子级中创建的,这意味着父级中没有引用。所以基本上,它归结为:有没有办法引用在子进程期间创建的信号量,以便我可以在守护进程停止时丢弃退出处理程序中的信号量?我不 没有代码可以分享,因为我真的不知道如何做到这一点。我在 Linux 系统上用 C 编写代码。谢谢你的帮助!

4

1 回答 1

0
   SemId = semget(IPC_PRIVATE, n, 0600);

您肯定是在使用它来创建信号量。这里,n是信号量的数量。

SemId可以在共享内存中。

这将允许您清除父级中的信号量。

如果您想避免创建全局变量并在父级中获取信号量或在共享内存中使用该变量,那么在退出子级之前,您绝对可以使用:

   semctl(SemId, 0, IPC_RMID, 0);

共享内存必须在父级中完成,可以使用:

   ID = shmget(IPC_PRIVATE, sizeof(int) * X, 0600);

共享内存的大小绝对是您的选择。

   SemId = (int *) shmat(ID, NULL, 0);

这将属性的空间SemId。退出后,子父级可以(或任何其他子级)访问此变量并使用semctl上述方法删除信号量。

您必须声明int *SemID为全局变量。

所以,如果创建信号量,semget使用该函数,你可以只返回它的值给SemId上面提到的。

如果您决定使用共享内存选项,则必须记住使用以下方法删除该内存的属性空间:

  shmdt((void *) SemId);
  shmctl(ID, IPC_RMID, NULL);
于 2012-11-14T22:21:22.557 回答