2013-09-23 55 views
0
#include <stdio.h> 
#include <fcntl.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/sem.h> 

int main() 
{ 
    key_t key, k, shmid; 
    int ret, semid, i = 0; 
    struct sembuf op[1]; 
    void *shmptr = (void *) 0; 

    union semun { 
    int val; 
    struct senid_ds *buf; 
    unsigned short *array; 
    }; 

    union semun arg; 

    /* Creating a shared memory */ 
    k = ftok(".", 1); 

    if (-1 == k) { 
    perror("\n ftok \n"); 
    return 1; 
    } 

    shmid = shmget(k, 1000, IPC_CREAT | 0744); 

    if (-1 == shmid) { 
    perror("\n Shared memory creation failed \n"); 
    return 2; 
    } 

    shmptr = shmat(shmid, (void *) 0, 0); 

    if (NULL == shmptr) { 
    perror("\n Process cant attach to shared memory segment! \n"); 
    return 3; 
    } 

    /* Creating semaphore */ 
    key = ftok(".", 4); 

    if (-1 == key) { 
    perror("\n ftok \n"); 
    return 4; 
    } 

#if 0 
    semid = semget(key, 1, IPC_CREAT); 
#else 
    semid = semget(key, 1, 0); 
#endif 

    if (-1 == semid) { 
    perror("\n Cannot create semaphore \n"); 
    return 5; 
    } 

#if 0 
    arg.val = 1; 
    ret = semctl(semid, 0, SETVAL, arg); 
    printf("\n ret : %d \n", ret); 
#endif 

    op[0].sem_num = 0; 
    op[0].sem_op = -1; 
    op[0].sem_flg = SEM_UNDO; 

    ret = semop(semid, op, 1); 

    // printf("\n ret : %d semop : %d\n",ret,op[0].sem); 
    printf("\n Process 1 locked sem1 \n"); 

    /* Do Operation on shared resource */ 
    while (i < 4) { 
    strcpy((char*) shmptr, "BDC"); 
    printf("\n %s \n", (char *) shmptr); 
    sleep(2); 
    printf("\n After sleep \n"); 
    i++; 
    shmptr++; 
    } 

    op[0].sem_op = 1; 
    ret = semop(semid, op, 1); 
    printf("\n Process A unlocked sem1 \n"); 

    return 0; 
} 

我試過了一個鎖定共享內存段的示例程序。我嘗試了同一個程序的兩個實例。查看信號量是否正確鎖定。但是,上面的程序總是允許其他進程在process1已被鎖定時使用共享內存。無法確定錯誤在哪裏。在共享內存中鎖定信號量問題

+0

你看到什麼讓你認爲它不工作?你做了什麼來試圖找出錯誤? – wallyk

+0

它必須是代碼中的'Yoda Conditions' –

+0

@wallyk:2個進程不同步訪問共享段 – Angus

回答

1

您應該啓用IPC_CREAT語句並逐位或將第三個參數設置爲必要但缺少的權限(S_IRWXU,至少)。

您應該啓用SETVAL語句將信號量初始化爲1,但只能根據外部輸入執行該語句(即程序調用的參數會導致它創建信號量並對其進行初始化);否則,程序應該假定信號量已經存在。

您需要檢查來自semop()調用的返回值。

+0

謝謝Steve。在創建時更改權限後,我也更改了鍵值。有效。 – Angus