- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我遇到了 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/
我在一个进程上有一个管道(服务器)等待使用 ConnectNamedPipe 的客户端。 在客户端进程中,我正在等待服务器开始使用 WaitNamedPipe 进行监听,我给它设置了 5000 毫秒的
我遇到了 WaitNamedPipe 函数挂起的问题。 ...这是我的代码中与问题相关的部分。我创建了一个进程,然后是一个管道,函数 WaitNamedPipe 似乎卡在了 FALSE 上,因此挂起。
WaitNamedPipe函数允许管道客户端应用程序同步等待命名管道服务器上的可用连接。然后你调用CreateFile以客户端身份打开管道。伪代码: // loop works around race
我的 C++ 程序中有一个命名管道。子进程在其中写入一个值,父进程读取它。我通过 mkfifo 创建了管道,所有操作都是阻塞的(fifo 在尝试打开进行写入和 v.v. 之前无法打开进行读取)不幸的是
我正在运行单元测试 ( Pytest ),以调用模拟的 Lambda(使用 Moto )并期望得到响应。假设我们正在导入 boto3 并创建了一个 lambda 客户端常量。这是函数: def inv
我是一名优秀的程序员,十分优秀!