为什么会出现分段错误(C 中的信号量)?

Why do I get segmentation fault (semaphore in C)?

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdlib.h>
#include <errno.h>

#define SEM_KEY_FILE ("idSem.txt")

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

int sem_fd;
key_t sem_key;
int sem_id;
sem_fd = open(SEM_KEY_FILE, O_RDWR);
if (sem_fd < 0) {
    perror("Nepodarilo sa otvorit kluc pre citanie");
    return 1;
}
if (read(sem_fd, &sem_key, sizeof(key_t)) != sizeof(key_t)) {
    perror("Chyba pri citani kluca semafora");
    return 2;
}
close(sem_fd);
sem_id = semget((key_t)sem_key, 0, 0666);
printf("%d\n", sem_id);
if (sem_id < 0)
{
    perror("Sada s takymto klucom neexistuje");
    return 3;
}
printf("%d\n", (int) sem_key);
return 0;
}

我在其他 c 文件中创建并初始化信号量 sem_create。有一个 sem_key 被写入 idSem.txt 在这个文件中 sem_open 我想从文本文件中获取 sem_key 并检查信号量是否存在,但我只得到分段错误因为 sem_id 是-1。我做错了什么吗?

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


union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};

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

int hodnota = atoi(argv[1]);
int id;
srand((unsigned)time(NULL));
int kluc;

union semun sem_union;
sem_union.val = hodnota;

do{
kluc = rand() % 100000;
id = semget((key_t)kluc, 1, 0666 | IPC_CREAT | IPC_EXCL);
}while (id == -1);

if (semctl(id, 0, SETVAL, sem_union) == -1)
    {
    perror("Neuspesne nastavenie hodnoty");
    exit(1);
    return 1;
    }
printf("%d\n", id);
return 0;   
}

由于文件只是普通的 ascii 文本,这一行需要一些额外的代码:

if (read(sem_fd, &sem_key, sizeof(key_t)) != sizeof(key_t)) {

类似于:

char asciiSemKey[20];
if (read(sem_fd, asciiSemKey, sizeof(asciiSemKey)) < 1)) {
  /* Do your error stuff here. */
}
...
sem_key = atol(asciiSemKey);