计算信号量的集合在Mac OSX上不起作用

时间:2017-02-01 07:32:53

标签: c macos semaphore

我有以下代码来测试信号量是否正常工作;

#include <stdio.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/sem.h>
#include <pthread.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>

int semID;
int i = -1;
struct sembuf sem_buf;

void * spawn(void * params){

    printf("semID: %d\n", semID);
    semop(semID, &sem_buf, 1);
    printf("i: %d\n", i);
    shmctl(semID, 0, IPC_RMID);

    return NULL;
}

int main(int argc, char const *argv[])
{

    sem_buf.sem_num = 0;
    sem_buf.sem_op = -1;
    sem_buf.sem_flg = SEM_UNDO;

    semID = semget(IPC_PRIVATE, 4, IPC_CREAT);
    printf("semID: %d\n", semID);
    semctl(semID, 0, SETALL);

    switch(errno){
        case EACCES:
        printf("EACCES\n");
        shmctl(semID, 0, IPC_RMID);
        //return 0;
        break;

        case EEXIST:
        printf("EEXIST\n");
        shmctl(semID, 0, IPC_RMID);
        return 0;
        break;

        case EINVAL:
        printf("EINVAL\n");
        shmctl(semID, 0, IPC_RMID);
        return 0;
        break;

        case ENOENT:
        printf("ENOENT\n");
        shmctl(semID, 0, IPC_RMID);
        return 0;
        break;

        case ENOSPC:
        printf("ENOSPC\n");
        shmctl(semID, 0, IPC_RMID);
        return 0;
        break;
    }

    pthread_t threadID;
    pthread_create(&threadID, NULL, spawn, NULL);

    sleep(1);
    printf("i is becoming 72.\n");
    i = 72;

    sem_buf.sem_num = 0;
    sem_buf.sem_op = 1;
    sem_buf.sem_flg = SEM_UNDO;

    return 0;
}

当我以root身份运行时,我有以下输出;

semID: 262144
semID: 262144
i: -1
i is becoming 72.

所以线程不是在等待信号量,但为什么会这样呢?代码出了什么问题?

我知道未命名的信号量,即 sem_init() sem_destroy(),在Mac OSX上不起作用,但在这里我们使用 setget( )等等。

编辑: 更改 semop()函数的第三个参数后,正如@Someprogrammerdude建议的那样,它有效,但仍然存在问题。在创建信号量时,如果我将零作为第二个参数,则返回 EINVAL ,但我检查了管理,但没有发生EINVAL错误的原因。那么这个案例有什么问题?

0 个答案:

没有答案