我在挂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);

我没有测试过,但这至少应该有一点点接近工作的机会。我完全不确定您命名的管道逻辑是否正确,但是至少这应该使您认识到可以开始以有意义的方式进行工作。

07-24 13:21