gpt4 book ai didi

c++ - WaitNamedPipe 只是挂起

转载 作者:可可西里 更新时间:2023-11-01 11:10:02 26 4
gpt4 key购买 nike

我遇到了 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com