如何使用共享文件使用read()和write()发送和接收消息? (C)

时间:2014-11-23 17:04:36

标签: c shared-memory inter-process-communicat

所以我有两个程序,分别是发送和接收消息的发送者和接收者(使用信号量)。这是我到目前为止的代码。

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”,但收件人将始终打印出空白邮件。

1 个答案:

答案 0 :(得分:0)

这里有两件事。首先,您只在接收器中打开写入,这可能导致您的操作系统无法从文件中读取。

此外,在触发信号量之前,无法保证内容实际上已写入文件。您还应该使用O_SYNC选项打开文件,以确保在write调用完成之前实际已将任何写入写入硬件,例如

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