Linux c 中的信号量清理
Semaphore cleanup in Linux c
当我创建共享内存(Linux 中的 c 程序)时,我使用 shmctl(shmid, IPC_RMID, 0)
将其删除,当我使用 ipcs -m
检查是否有任何内容时,一切看起来都很好剩余的共享内存段。但是我想知道如何删除我在程序终止之前创建的信号量,因为当我使用 ipcs -s
时,我看到我的两个信号量就在那里,结果:
------ Semaphore Arrays --------
key semid owner perms nsems
0x6b014021 0 benjamin 600 1
0x6c014021 1 benjamin 600 1
谢谢。
在将 KEY 设置为 ipcs -s
返回的正确值后,您可以使用 semget
和 semctl
:
#define KEY 0x...
int id, rc;
id = semget(KEY, 1, IPC_STAT);
if (id < 0)
{
perror("semget");
exit(1);
}
rc = semctl(id, 1, IPC_RMID);
if (rc < 0)
{
perror("semctl");
exit(1);
}
或者直接使用semctl
和ipcs -s
返回的id:
rc = semctl(id, 1, IPC_RMID);
if (rc < 0)
{
perror("semctl");
exit(1);
}
完整的 C 程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/sem.h>
#include <errno.h>
int main(int argc, char **argv){
int id, rc;
id = atoi(argv[1]);
printf("id=%d\n", id);
rc = semctl(id, 1, IPC_RMID);
if (rc < 0)
{
perror("semctl");
exit(1);
}
exit(0);
}
执行:
$ ipcs -s
------ Tableaux de sémaphores --------
clef semid propriétaire perms nsems
0x00001111 393221 pifor 666 1
$ ./rsem 393221
id=393221
$ ipcs -s
------ Tableaux de sémaphores --------
clef semid propriétaire perms nsems
当我创建共享内存(Linux 中的 c 程序)时,我使用 shmctl(shmid, IPC_RMID, 0)
将其删除,当我使用 ipcs -m
检查是否有任何内容时,一切看起来都很好剩余的共享内存段。但是我想知道如何删除我在程序终止之前创建的信号量,因为当我使用 ipcs -s
时,我看到我的两个信号量就在那里,结果:
------ Semaphore Arrays --------
key semid owner perms nsems
0x6b014021 0 benjamin 600 1
0x6c014021 1 benjamin 600 1
谢谢。
在将 KEY 设置为 ipcs -s
返回的正确值后,您可以使用 semget
和 semctl
:
#define KEY 0x...
int id, rc;
id = semget(KEY, 1, IPC_STAT);
if (id < 0)
{
perror("semget");
exit(1);
}
rc = semctl(id, 1, IPC_RMID);
if (rc < 0)
{
perror("semctl");
exit(1);
}
或者直接使用semctl
和ipcs -s
返回的id:
rc = semctl(id, 1, IPC_RMID);
if (rc < 0)
{
perror("semctl");
exit(1);
}
完整的 C 程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/sem.h>
#include <errno.h>
int main(int argc, char **argv){
int id, rc;
id = atoi(argv[1]);
printf("id=%d\n", id);
rc = semctl(id, 1, IPC_RMID);
if (rc < 0)
{
perror("semctl");
exit(1);
}
exit(0);
}
执行:
$ ipcs -s
------ Tableaux de sémaphores --------
clef semid propriétaire perms nsems
0x00001111 393221 pifor 666 1
$ ./rsem 393221
id=393221
$ ipcs -s
------ Tableaux de sémaphores --------
clef semid propriétaire perms nsems