2012-11-14 32 views
0

我目前正在编写一个web服务器以更好地熟悉进程和进程间通信。当请求一个文件时,我将其锁定,以确保在读取/写入期间文件没有变化。这工作正常。我的问题是如何在守护进程完成执行后清除内存中的锁。我知道信号量在创建它们的进程停止执行之后仍然存在。我知道丢弃信号量需要在父项中完成,但是信号量是在子项中创建的,这意味着父项中没有引用。所以基本上,这归结为:是否有一种方法可以引用子进程期间创建的信号量,以便在守护进程停止时可以丢弃退出处理程序中的信号量?我没有代码可以分享,因为我真的不知道如何做到这一点。我在Linux系统上使用C编码。 感谢您的帮助!在守护进程中释放信号灯

回答

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); 
+0

好感谢。我为每个被访问的文件创建一个信号量,所以我可以得到与给定目录中的文件一样多的信号量(全部在不同的时间创建)将清除semid,足以清除所有的信号量,如果它们被创建分别? – tpar44

+0

如果有多个信号灯,这意味着你有几个不同的'SemId'。这意味着你必须为每个文件调用'semctl'。 最简单的解决方案是知道文件数量并获得与父文件数量相等的信号量。 如果您正在测试使用'ipcs -s num'和 'ipcrm -s'来清除任何它们,如果它们离开。 – 2012-11-14 22:43:45

+0

事实上,当我想到它时,您只需通过创建新的信号量来重写'SemId',所以我想有时候您将无法删除它们。 您确定只能使用一个信号灯吗? – 2012-11-14 22:50:51