cleanupsem.cpp

来自「俄罗斯牛人KK的作品,著名的ORDBMS,这里上传最新的3.39版本源代码.希望」· C++ 代码 · 共 71 行

CPP
71
字号
/*-< CLEANUPSEM.CPP >------------------------------------------------*--------*/
// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *
// (Main Memory Database Management System)                          *   /\|  *
//                                                                   *  /  \  *
//                          Created:     05-Aug-2004  K.A. Knizhnik  * / [] \ *
//                          Last update: 05-Aug-2004  K.A. Knizhnik  * GARRET *
//-------------------------------------------------------------------*--------*
// Unix utility to cleanup FastDB semaphores
//-------------------------------------------------------------------*--------*

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static char* keyFileDir = "/tmp/";

int getKey(char* databaseName, char* suffix) { 
    char fileName[1024];
    strcat(strcpy(fileName, databaseName), suffix);
    return ftok(fileName, '0');
}

void removeSemaphore(char* databaseName, char* suffix) { 
    int key = getKey(databaseName, suffix);
    if (key >= 0) { 
        int id = semget(key, 0, 0);
        if (id >= 0) { 
            semctl(id, 0, IPC_RMID, NULL);
        }
    }
}

void removeSharedMemory(char* databaseName, char* suffix) { 
    int key = getKey(databaseName, suffix);
    if (key >= 0) { 
        int id = shmget(key, 0, 0);
        if (id >= 0) { 
            shmctl(id, IPC_RMID, NULL);
        }
    }
}
        

int main(int argc, char* argv[]) { 
    if (argc < 2) { 
        printf("Usage: cleanupsem DATABASE-NAME\n");
        return 1;
    }
    char* databaseName = argv[1];    
    if (strchr(databaseName, '/') == NULL) { 
        char* fullName = new char[strlen(keyFileDir) + strlen(databaseName) + 1];
        databaseName = strcat(strcpy(fullName, keyFileDir), databaseName);
    }
    removeSharedMemory(databaseName, ".dm");    
    removeSemaphore(databaseName, ".in");    
    removeSemaphore(databaseName, ".ws");    
    removeSemaphore(databaseName, ".rs");    
    removeSemaphore(databaseName, ".us");    
    removeSemaphore(databaseName, ".bce");
    removeSemaphore(databaseName, ".dce");
    removeSemaphore(databaseName, ".bce");    
    removeSemaphore(databaseName, ".cs");
    removeSemaphore(databaseName, ".mcs");
    printf("All semaphores are removed\n");
    return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?