c++ - WaitNamedPipe 只是挂起

标签 c++ c windows named-pipes

我遇到了 WaitNamedPipe 函数挂起的问题。 ...这是我的代码中与问题相关的部分。我创建了一个进程,然后是一个管道,函数 WaitNamedPipe 似乎卡在了 FALSE 上,因此挂起。函数 waitnamedpipe 等待 CC 进程启动。

PROCESS_INFORMATION po;
STARTUPINFO s;

GetStartupInfo (&s);

if(CreateProcess ("c:\\s2.exe", NULL, NULL, NULL, false, 0, NULL, NULL, &s, &po) == FALSE)
{
    printf("Error %d starting CC\n", GetLastError());
    exit(-1);
}


HANDLE pipe=CreateNamedPipe ("\\.\pipe\CC-"+po.dwProcessId, 0x00000003, 0x40000000, 
                               0x00080000L, 0x00000004, 128, 0, NULL);

while (WaitNamedPipe ("\\.\pipe\CC-"+po.dwProcessId, INFINITE) == FALSE )
    Sleep (300);

*编辑我改变了一些..但是它仍然挂起

PROCESS_INFORMATION po; STARTUPINFO s;
GetStartupInfo (&s);
if(CreateProcess ("c:\\s2.exe", NULL,
                   NULL, NULL, false, 0, NULL, NULL, &s,
                   &po) == FALSE) {
     printf("Error %d starting CC\n", GetLastError());
     exit(-1);
 }

HANDLE pipe=CreateNamedPipe(pipe_name, 0x00000003,
                           FILE_FLAG_FIRST_PIPE_INSTANCE,
                           PIPE_UNLIMITED_INSTANCES,128, 128, 0,
                           NULL);

while(WaitNamedPipe(pipe_name, INFINITE)==FALSE)
Sleep(300);

HANDLE CC = CreateFile (pipe_name,
                        GENERIC_READ | GENERIC_WRITE, 0, NULL,
                        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
                        NULL);

bool fConnected =  ConnectNamedPipe(pipe, NULL) ?  TRUE :
                           (GetLastError() == ERROR_PIPE_CONNECTED); 

if(fConnected)  printf("true"); else  printf("false");

最佳答案

您可能还有其他问题,但这里有两个问题:

"\\.\pipe\CC-"+po.dwProcessId

首先,反斜杠字符在 C 和 C++ 字符串中用作转义字符,因此您需要在源代码中使用两个反斜杠来为字符串本身提供一个反斜杠。因此,首先,您的字符串需要是:

"\\\\.\\pipe\\CC-"

第二个问题是 +po.dwProcessId 部分。 "\\.\pipe\CC-" 部分给出了一个指向静态字符串开头的指针。然后将 dwProcessId 的值添加到该指针。如果您的进程 ID 恰好是一个小于字符串的数字,它将在字符串中给出一个指向后面的指针(例如,如果它恰好是 2,它将产生一个指向 的指针。\\pipe\\CC-",跳过两个前导反斜杠。如果(更常见的情况)进程 ID 恰好是一个大于字符串长度的数字,您将得到一个指向一些你根本不拥有的内存,也不知道它可能包含什么。

这意味着您为 CreateNamedPipe 指定的名称基本上肯定是无效的。由于它无法创建命名管道,WaitNamedPipe 将立即返回 false —— 正是您观察到的行为。

你可以尝试更像这样的东西:

char pipe_name[32];
sprintf(pipe_name, "\\\\.\\pipe\\CC-%d", po.dwProcessId);

HANDLE pipe = CreateNamedPipe(pipe_name, /* ... */);

WaitNamedPipe(pipe, NMPWAIT_WAIT_FOREVER);

我还没有测试过,但这至少应该有一点点接近工作的机会。我还不确定您的命名管道逻辑是否正确,但至少这应该让您明白您可以开始以有意义的方式处理它。

关于c++ - WaitNamedPipe 只是挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4824770/

相关文章:

c++ - 解决正交模块的依赖关系

c++ - 在 C++ 中填充二维 vector

c - Socket Programming in C : When client exit server, 服务器崩溃

c - 函数和状态机的通用指针

xml - 如何使用 xml starlet 选择 xml 值

c++ - 如何在C/C++中设置获取互斥量的优先级

c++ - 在 C++ 代码中设置 while 循环的执行速率以实现实时同步

c++ - 如何使用 g++ for linux 编译 C++ 程序以在 Windows 操作系统中工作?

c - MPI 和变量覆盖?

java - Windows 上的 System.err 在哪里?