登录
多线程程序中利用管道控制select行为
电子工程师
2019-04-02
341
分享海报
嵌入式技术
1378
人已加入
+加入圈子
描述
$ cat pipe.c
#include
#include
#include
#include
int fdctl[2];// 这个管道在建立线程之前建立。创建线程之后,两个线程各连接其中一端。因为不存在 fork 导致的 fd 复制,所以不需要像普通多进程环境一样 close 一端
// 控制线程,使用 fdctl[0]
void *thfun( void *arg )
{
int i;
for ( i = 0; i < 3; ++i )
{
printf( "%d sec\n", i );
sleep( 1 );
}
close( fdctl[0] );// 当一个 fd 被关闭的时候,会触发 readable / writable 事件
}
// 主线程 select 阻塞
int main()
{
fd_set rdset;
int maxfd = 2;
pipe( fdctl );
maxfd = fdctl[1];
FD_ZERO( &rdset );
FD_SET( STDIN_FILENO, &rdset ); // 需要被监测的 fd,通常为 socket。这里用 stdin 代替
FD_SET( fdctl[1], &rdset ); // 控制管道。虽然 close 管道一端会同时引发 readable / writable 事件,但是由于 pipe 有缓冲,默认情况下 pipe 就是 writable 的,所以使用 rdset 进行监测
pthread_t tid;
pthread_create( &tid, NULL, thfun, NULL );
int res = select( maxfd + 1, &rdset, NULL, NULL, NULL ); // 同时监测 socket 和控制管道。writable set 也可以同时监测其它 fd
printf( "select() returned with %d\n", res );
if ( res == 1 ) {
if ( FD_ISSET( fdctl[1], &rdset ) ) // 是否控制管道产生的事件?
printf( "Ctrled Exit\n" ); // 如果是,则是由于控制线程触发。select 阻塞被成功打断
else
deal_with_fd(); // 不是控制管道的信息;处理来自 socket 的信息
}
return 0;
}
打开APP阅读更多精彩内容
点击阅读全文
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
相关推荐
改进的
多线程
应用
程序
调试(Altium Designer版本10)
2012-05-15
1400
多线程
的过程
程序
2021-08-24
0
利用
线程
的互斥实现串口
多线程
收发数据
2022-01-07
0
多线程
在VC++串口通信
程序
中
的应用
2009-09-03
597
利用
MIPS
多线程
处理器优化SoC设计
2011-01-20
2717
MFC--
多线程
程序
设计
2016-09-01
572
多线程
与聊天室
程序
的创建
2017-05-16
891
设计
多线程
和多核系统
2017-08-14
1224
C#
多线程
技术
2018-04-23
864
如何
利用
基于字节码插桩实现的
多线程
调试工具
2020-07-06
791
Java
多线程
的用法
2023-09-30
965
多线程
如何保证数据的同步
2023-11-17
1263
mfc
多线程
编程实例
2023-12-01
1521
java实现
多线程
的几种方式
2024-03-14
737
socket
多线程
编程实现方法
2024-11-12
397
全部
0
条评论
快来发表一下你的评论吧 !
发送
登录/注册
×
20
完善资料,
赚取积分