标题:请教下windows下的管道操作.
取消只看楼主
bleakwind
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-4-15
结帖率:50%
已结贴  问题点数:20 回复次数:2 
请教下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
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
bleakwind
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-4-15
得分:0 
已经对照msdn手册学会用了,多谢大家...
2016-05-29 20:08



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-465333-1-1.html




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

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