为什么会出现分段错误(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);
#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);