所以我有两个程序,分别是发送和接收消息的发送者和接收者(使用信号量)。这是我到目前为止的代码。
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 :(得分:0)
这里有两件事。首先,您只在接收器中打开写入,这可能导致您的操作系统无法从文件中读取。
此外,在触发信号量之前,无法保证内容实际上已写入文件。您还应该使用O_SYNC
选项打开文件,以确保在write
调用完成之前实际已将任何写入写入硬件,例如
int fd = open("channel.txt", O_WRONLY | O_SYNC);