2015-12-09 45 views
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; 
} 
+1

有代码,显示了信号键是如何写入文件? –

+0

我在bash中创建了一个脚本。 #!/ bin/bash semafor = $(sem_get 1) echo $ semafor> idSem.txt –

+0

那么,如果你捕捉文件,你只是看到一个数字? –

回答

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); 
+0

我想打开信号量,像这样semaphore = $ {sem_open}我正在做对吗?由于相同的结果分段错误。 –

相关问题