2
arg.val = 1;

    if (sem_id = semget(IPC_PRIVATE, 1, 0600 | IPC_CREAT) == -1 ){
            perror("Creating semaphore failed");
            exit(1);
    }
    else {
            printf("Creating a semaphore with ID: %d \n",sem_id);
            if (semctl(sem_id, 0, SETVAL, arg) == -1 ) {                       
                    perror("Initialization of semaphore failed\n");
                    exit(1);
            }
    }

セマフォを作成して初期化しようとしていますが、プログラムをコンパイルすると、次のように返されます。
「セマフォの初期化に失敗しました:識別子が削除されました

これが起こる理由を教えていただけますか?

4

2 に答える 2

1
if (sem_id = semget(IPC_PRIVATE, 1, 0600 | IPC_CREAT) == -1 )

解析されます (==バインドが よりも強いため=)

if (sem_id = (semget(IPC_PRIVATE, 1, 0600 | IPC_CREAT) == -1) )

あなたはおそらく欲しい

if ((sem_id = semget(IPC_PRIVATE, 1, 0600 | IPC_CREAT)) == -1 )
于 2012-12-16T20:17:36.277 に答える
1

== 操作は = 操作よりも優先されます。これは、sem_idが真の値に設定されていることを意味すると思います。if ステートメントで操作をグループ化する必要があります。

if((sem_id = semget(IPC_PRIVATE, 1, 0600 | IPC_CREAT)) == -1){
于 2012-12-16T20:18:11.877 に答える