2014-11-23 8 views
0

그래서 나는 각각 세마포어를 사용하여 메시지를 송수신하는 두 개의 프로그램, 송신자와 수신자를 가지고있다. 이것은 내가 지금까지 가지고있는 코드입니다.공유 파일을 사용하여 read() 및 write()를 사용하여 메시지를 보내고 받으려면 어떻게해야합니까? (C)

sender.c

int main(int argc, char *argv[]){ 
    if(argc != 2){ 
     printf("%s [message]\n", argv[0]); 
     return -1; 
    } 
    sem_t *semid = sem_open(SEM_NAME, O_CREAT, 00666, 0); 
    char *message = argv[1]; 
    int fd = open("channel.txt", O_WRONLY); 
    write(fd, message, strlen(message)); 
    sem_post(semid); 

    sem_close(semid); 
    close(fd); 
    return 0; 
} 

receiver.c

int main(int argc, char *argv[]){ 
    char *buf = malloc(256); 
    sem_t *semid = sem_open(SEM_NAME, O_CREAT, 00666, 0); 
    int fd = open("channel.txt", O_WRONLY); 

    while(TRUE){ 
     sem_wait(semid); 
     lseek(fd, 0, SEEK_SET); 
     read(fd, buf, sizeof(buf)); 
     printf("receiver [msg arrival]: %s\n", buf); 
    } 

    close(fd); 
    free(buf); 
    sem_close(semid); 
    sem_unlink(SEM_NAME); 
    return 0; 
} 

보낸 파일 "channel.txt"에 메시지를 쓸 수 있지만 수신기는 항상 빈을 인쇄합니다 메시지.

+0

파일을받는 사람에게만 여는 중입니다. – slugonamission

답변

0

여기에는 두 가지가 있습니다. 첫째, 수신기에서만 쓰기를 시작하므로 OS에서 파일을 읽을 수 없습니다.

또한 세마포어를 트리거하기 전에 내용이 실제로 파일에 기록되었다고 보장 할 수 없습니다. write 호출이 완료되기 전에 하드웨어에 쓰기가 실제로 이루어 졌는지 확인하려면 O_SYNC 옵션으로 파일을 열어야합니다 (예 :

int fd = open("channel.txt", O_WRONLY | O_SYNC);