1
#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,所以我只得到分段错误。难道我做错了什么?为什么我会得到分段错误(C语言中的信号量)?
#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;
}
有代码,显示了信号键是如何写入文件? –
我在bash中创建了一个脚本。 #!/ bin/bash semafor = $(sem_get 1) echo $ semafor> idSem.txt –
那么,如果你捕捉文件,你只是看到一个数字? –