共有メモリセグメントを削除するC++プログラムを作成しようとしています。私はそれがを使用してcmdプロンプトから行うことができることを知っています
ipcs -m | awk '{ print $2 }' | xargs ipcrm -m
しかし、共有メモリのガベージコレクターを作成するために、C++を使用してそれを実行しようとしています。
プロセス(nattach == 0)またはステータス==NULLに接続されていない共有メモリセグメントを削除するという考え方です。
共有メモリセグメントを削除するC++プログラムを作成しようとしています。私はそれがを使用してcmdプロンプトから行うことができることを知っています
ipcs -m | awk '{ print $2 }' | xargs ipcrm -m
しかし、共有メモリのガベージコレクターを作成するために、C++を使用してそれを実行しようとしています。
プロセス(nattach == 0)またはステータス==NULLに接続されていない共有メモリセグメントを削除するという考え方です。
私はついに自分の質問に対する答えを手に入れました。これは、shmctlフラグを使用して実行できます。
shmctl(0,SHM_INFO,&shm_info);
現在存在するセグメントの数を示します。
shmctl(i , SHM_STAT , &shm_segment)
セグメントIDを与える
からもアクセスできますshm_segment.shm_id
#include <sys/shm.h>
int delete_segment(int seg_id){
if ((shmctl(seg_id,IPC_RMID,0))==-1){
std::cout<<" ERROR(C++)with shmctl(IPC_RMID): "<<strerror(errno)<<std::endl;
return -1;
}else//on success
return 0;
}
void clean_segments(){
struct shmid_ds shm_info;
struct shmid_ds shm_segment;
int max_id = shmctl(0,SHM_INFO,&shm_info);
if (max_id>=0){
for (int i=0;i<=max_id;++i) {
int shm_id = shmctl(i , SHM_STAT , &shm_segment);
if (shm_id<=0)
continue;
else if (shm_segment.shm_nattch==0){
delete_segment(shm_id);
}
}
}
return result;
}
strace ipcrm -m <your-arguments>
実行して、どのシステムコールが実行するかを確認することをお勧めします。ほとんどの場合、それで十分です(少なくとも正しい方向を示します)。そうでない場合は、ipcrmのソースコードを確認してください。特別な特権は必要ないと確信しています(私のシステムのipcrmにはSUIDまたはSGIDビットが設定されていません)。
以下のコードはIを使用しています。
void clean_segments(int startId, int endId) {
for (int i=startId; i<=endId; ++i) {
struct shmid_ds shm_segment;
int shm_id = shmctl(i, SHM_STAT, &shm_segment);
delete_segment(shm_id);
printf("Segment %d has been deleted\n", shm_id);
}}
clean_segments(1146894、6357160);//上記のコードの使用例