关于server-client
最近开始学习IPC,关于server-client之间是如何相互控制的有点不明白。
以下面的为例子说明一下?
server_main.c:
void server(int readfd, int writefd)
{
int fd;
ssize_t n;
char buff[MAXLINE+1];
/* 4read pathname from IPC channel */
if ( (n = read(readfd, buff, MAXLINE)) == 0)
printf("end-of-file while reading pathname");
buff[n] = ''; /* null terminate pathname */
if ( (fd = open(buff, O_RDONLY)) < 0) {
/* 4error: must tell client */
snprintf(buff + n, sizeof(buff) - n, ": can't open, %sn",
strerror(errno));
n = strlen(buff);
write(writefd, buff, n);
} else {
/* 4open succeeded: copy file to IPC channel */
while ( (n = read(fd, buff, MAXLINE)) > 0)
write(writefd, buff, n);
close(fd);
}
}
int
main(int argc, char **argv)
{
int readfd, writefd;
/* 4create two FIFOs; OK if they already exist */
if ((mkfifo(FIFO1, FILE_MODE) < 0) && (errno != EEXIST))
printf("can't create %s", FIFO1);
if ((mkfifo(FIFO2, FILE_MODE) < 0) && (errno != EEXIST)) {
unlink(FIFO1);
printf("can't create %s", FIFO2);
}
readfd = open(FIFO1, O_RDONLY, 0);
writefd = open(FIFO2, O_WRONLY, 0);
server(readfd, writefd);
exit(0);
}
client_main.c:
void client(int readfd, int writefd)
{
size_t len;
ssize_t n;
char buff[MAXLINE];
/* 4read pathname */
fgets(buff, MAXLINE, stdin);
len = strlen(buff); /* fgets() guarantees null byte at end */
if (buff[len-1] == 'n')
len--; /* delete newline from fgets() */
/* 4write pathname to IPC channel */
write(writefd, buff, len);
/* 4read from IPC, write to standard output */
while ( (n = read(readfd, buff, MAXLINE)) > 0)
write(STDOUT_FILENO, buff, n);
}
int
main(int argc, char **argv)
{
int readfd, writefd;
writefd = open(FIFO1, O_WRONLY, 0);
readfd = open(FIFO2, O_RDONLY, 0);
client(readfd, writefd);
close(readfd);
close(writefd);
unlink(FIFO1);
unlink(FIFO2);
exit(0);
}
书上的实现是:先把server_main放在后台运行,然后再调用client_main。最终的结果是对的。
但是我不明白:在server_main中没有采用循环的时候询问client是否write值到fifo,那server如何知道client什么时候write值到fifo呢?
^_^刚刚开始学,还请大家多多指教咱呢~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
???怎么没人回答啊?
斑斑呢?
麻烦高手点拨一下~谢谢啦!
恩,我知道是可以通过readfd读出的,但是我不知道server怎么知道client什么时候往FIFO中写东西的?而且server代码中只有1次判断FIFO中是否有内容的" if ( (n = read(readfd, buff, MAXLINE)) == 0)",我觉得应该把if换成while来不停的询问client是否往FIFO中写内容,但是我试了一下,用if执行也是对的,^_^所以偶有点不明白。server和client的同步问题
FIFO是一种特殊的文件,和pipe类似,当有内容写入FIFO时,通过readfd可以将它读出(否则read函数将一直阻塞进程)。