| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5551 人关注过本帖
标题:请教下windows下的管道操作.
只看楼主 加入收藏
bleakwind
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-4-15
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:5 
请教下windows下的管道操作.
我主要取得文件描述符

Linux/Unix下:
pipe(pipeline);
write(pipeline[1], data_source, data_source_len);
pipeline[0] <- 取得文件描述符
windows下我用CreatePipe咋都实现不了
感觉linux下pipe非阻塞的
windows下CreatePipe后WriteFile后就阻塞住了
查资料要创建进程, 可是捣鼓一通也不行是否能像下面这样不创建进程?
程序代码:
HANDLE piperead, pipewrite;
SECURITY_ATTRIBUTES sa;

sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&piperead, &pipewrite, &sa, 0)) {
    return NULL;
}

if (!WriteFile(pipewrite, data_source, data_source_len, NULL, NULL)) {
    return NULL;
}
int file_des = _open_osfhandle((zend_intptr_t)piperead, 0); <- 取得文件描述符

搜索更多相关主题的帖子: windows linux Linux write 管道 
2016-05-28 16:46
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:10 
WriteFile要到写完所有的字节数才会返回。
“要创建进程”,意思可能是WriteFile放到子进程或子线程,这样主进程或主线程就不会有“阻塞”的感觉。
2016-05-29 07:59
bleakwind
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-4-15
收藏
得分:0 
以下是引用吹水佬在2016-5-29 07:59:42的发言:

WriteFile要到写完所有的字节数才会返回。
“要创建进程”,意思可能是WriteFile放到子进程或子线程,这样主进程或主线程就不会有“阻塞”的感觉。


感谢回复, 查了下匿名管道不支持异步.
退而求其次, 我查了下命名管道的用法, 写出来后不阻塞, 但数据不对,是否我取文件描述符取的不对?

程序代码:
    const char *pStrPipeName = "\\\\.\\pipe\\NamePipe_MoreWindows";
    DWORD dwLen = 0;
    OVERLAPPED ov;
    memset(&ov, 0, sizeof(OVERLAPPED));

    HANDLE hPipe = CreateNamedPipe(pStrPipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_NOWAIT, PIPE_UNLIMITED_INSTANCES, 0, 0, NMPWAIT_WAIT_FOREVER, 0);
    if (WaitNamedPipe(pStrPipeName, NMPWAIT_WAIT_FOREVER) == FALSE) {
        return NULL;
    }

    WriteFileEx(hPipe, data_source, data_source_len, &dwLen, &ov);

    int file_des = _open_osfhandle((intptr_t)hPipe, 0);
2016-05-29 09:36
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:10 
回复 3楼 bleakwind
命名管道有点象TCP的C/S,通信功能较强,可以跨网络通信。
一般用法过程:
服务端:
CreateNamedPipe()     创建命名管道
CreateEvent()         添加等待客户端连接命名管道事件
ConnectNamedPipe()    等待客户端连接, 可用DisconnectNamedPipe()断开
WaitForSingleObject() 等待事件
ReadFile()            读数据
WriteFile()           写数据
CloseHandle()         关闭管道和事件

客户端:
WaitNamedPipe()       等待连接管道
CreateFile()          打开管道
ReadFile()            读数据
WriteFile()           写数据
2016-05-29 15:21
bleakwind
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-4-15
收藏
得分:0 
已经对照msdn手册学会用了,多谢大家...
2016-05-29 20:08
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
以下是引用bleakwind在2016-5-29 20:08:47的发言:

已经对照msdn手册学会用了,多谢大家...

期待分享经验和杰作。
2016-05-29 20:28
快速回复:请教下windows下的管道操作.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034895 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved