77范文网 - 专业文章范例文档资料分享平台

Linux进程通信:命名管道FIFO小结(4)

来源:网络收集 时间:2021-09-24 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

int server_fifo_fd;

int client_fifo_fd;

int res;

char client_fifo_name[NAME_SIZE];

message msg;

msg.client_pid = getpid();

sprintf(client_fifo_name, CLIENT_FIFO_NAME, msg.client_pid);

if (mkfifo(client_fifo_name, 0777) == -1)

{

fprintf(stderr, "Sorry, create client fifo failure!\n");

exit(EXIT_FAILURE);

}

server_fifo_fd = open(SERVER_FIFO_NAME, O_WRONLY);

if (server_fifo_fd == -1)

{

fprintf(stderr, "Sorry, open server fifo failure!\n");

exit(EXIT_FAILURE);

}

sprintf(msg.data, "Hello from %d", msg.client_pid);

printf("%d sent %s ", msg.client_pid, msg.data);

write(server_fifo_fd, &msg, sizeof(msg));

client_fifo_fd = open(client_fifo_name, O_RDONLY);

if (client_fifo_fd == -1)

Linux进程通信:命名管道FIFO小结,有实例

{

fprintf(stderr, "Sorry, client fifo open failure!\n");

exit(EXIT_FAILURE);

}

res = read(client_fifo_fd, &msg, sizeof(msg));

if (res > 0)

{

printf("received:%s\n", msg.data);

}

close(client_fifo_fd);

close(server_fifo_fd);

unlink(client_fifo_name);

exit(EXIT_SUCCESS);

}

编译程序:

gcc –o server server.c

gcc –o client client.c

测试这个程序,我们需要一个服务器进程和多个客户进程。为了让多个客户进程在同一时间启动,我们使用了shell命令:

[root@localhost chaper12]# ./server &

[26] 5171

[root@localhost chaper12]# for i in 1 2 3 4 5; do ./client & done

[27] 5172

[28] 5173

[29] 5174

[30] 5175

Linux进程通信:命名管道FIFO小结,有实例

[31] 5176

[root@localhost chaper12]# 5172 sent Hello from 5172 received:HELLO FROM 5172

5173 sent Hello from 5173 received:HELLO FROM 5173

5174 sent Hello from 5174 received:HELLO FROM 5174

5175 sent Hello from 5175 received:HELLO FROM 5175

5176 sent Hello from 5176 received:HELLO FROM 5176

分析这个例子,服务器以只读模式创建它的FIFO并阻塞,直到第一个客户以写方式打开同一现个FIFO来建立连接为止。此时,服务器进程解除阻塞并执行sleep语句,这使得来自客户的数据排除等候。在实际应用程序中,应该把sleep语句删除,这里面只是为了演示当有多个客户请求同时到达时,程序的正确操作方法。

与此同时,在客户端打开服务器FIFO后,它创建自己唯一的一个命名管道以读取服务器返回的数据。完成这些工作后,客户发送数据给服务器(如果管道满或服务器仍处于休眠就阻塞),并阻塞于对自己FIFO的read调用上,等待服务器响应。

接收到来自客户的数据后,服务器处于它,然后以写的方式打开客户管道并将处理后的数据返回,这将解除客户端的阻塞状态,客户程序就可以从自己的管道里面读取服务器返回的数据了。

整个处理过程不断重复,直到最后一个客户关闭服务器管道为止,这将使服务器的read调用失败(返回0),因为已经没有进程以写方式打开服务器管道了。如果这是一个真正的服务器进程的话,它还需要继续等待其他客户的请求,我们就需要对它进行修改,有两种方法:

(1)对它自己的服务器管道打开一个文件描述符,这样read调用将阻塞而不是返回0。

(2)当read调用返回0时,关闭并重新打开服务器管道,使服务器进程阻塞在open调用处以等待客户的到来,就像它最初启动时那样。

本文来自CSDN博客,转载请标明出处:/MONKEY_D_MENG/archive/2010/06/06/5651430.aspx

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说医药卫生Linux进程通信:命名管道FIFO小结(4)在线全文阅读。

Linux进程通信:命名管道FIFO小结(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/yiyao/1250212.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: