- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 CloseHandle(pipe_settings->hPipe) 上收到一个 sigsegv;我在这个例子中也使用了线程,我认为这与任何事情都没有关系,因为管道是在同一个线程中打开和关闭的。
管道句柄似乎也有效。类似于:0xcc。事件句柄也正确关闭。
这是一个完全有效的示例,您应该能够将其放入 CLion 中并开始使用。此代码在任何 Windows 安装上都应该是安全的。
#include <stdio.h>
#include <windows.h>
#include <unistd.h>
#define UNICODE
#define PIPE_BUFFER_SIZE 4096
#define PIPE_TIMEOUT 10000
#define PIPE_MAX_CONNECT_TIMEOUT 10000
#define PIPE_CONNECT_FAIL_REPEAT_DELAY 1000
#define DUST_TEST_PIPE_NAME "\\\\.\\pipe\\DustTestPipe"
#define PIPE_TEST_TIMEOUT 100000
struct pipe_settings {
HANDLE hPipe;
OVERLAPPED ol;
LPCTSTR name;
DWORD pipe_timeout;
};
WINBOOL PipeClose(struct pipe_settings *pipe_settings)
{
//Dies on CloseHandle(pipe_settings->hPipe) but not on CloseHandle(pipe_settings->ol.hEvent)
return (CloseHandle(pipe_settings->ol.hEvent) && CloseHandle(pipe_settings->hPipe));
}
void InitializePipeSettings(struct pipe_settings *pipe_settings)
{
pipe_settings->hPipe = INVALID_HANDLE_VALUE;
pipe_settings->ol.hEvent = INVALID_HANDLE_VALUE;
pipe_settings->ol.Internal = 0;
pipe_settings->ol.InternalHigh = 0;
pipe_settings->ol.Offset = 0;
pipe_settings->ol.OffsetHigh = 0;
pipe_settings->ol.Pointer = NULL;
}
DWORD PipeConnectToClient(struct pipe_settings *pipe_settings)
{
HANDLE h;
DWORD err;
InitializePipeSettings(pipe_settings);
for(int x = 0; x < PIPE_MAX_CONNECT_TIMEOUT; x += PIPE_CONNECT_FAIL_REPEAT_DELAY)
{
h = CreateFile(
pipe_settings->name,
GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL
);
err = GetLastError();
if (h != INVALID_HANDLE_VALUE)
break;
if(err == ERROR_FILE_NOT_FOUND) {
//The pipe might not be open yet
sleep(PIPE_CONNECT_FAIL_REPEAT_DELAY/1000);
continue;
}
else if (err != ERROR_PIPE_BUSY) {
return err;
}
if (!WaitNamedPipe(pipe_settings->name, (DWORD)PIPE_MAX_CONNECT_TIMEOUT - x))
{
return ERROR_PIPE_BUSY;
}
}
if(h == INVALID_HANDLE_VALUE)
return err;
pipe_settings->hPipe = h;
DWORD dwMode = PIPE_READMODE_BYTE;
if(!SetNamedPipeHandleState(h, &dwMode, NULL, NULL))
return GetLastError();
return ERROR_SUCCESS;
}
DWORD PipeListenForServerConnect(struct pipe_settings *pipe_settings)
{
InitializePipeSettings(pipe_settings);
HANDLE hPipe = CreateNamedPipe(
pipe_settings->name,
PIPE_ACCESS_INBOUND | // read/write access
FILE_FLAG_OVERLAPPED, // overlapped mode
PIPE_TYPE_BYTE | // message-type pipe
PIPE_READMODE_BYTE | // message-read mode
PIPE_WAIT,
1,
PIPE_BUFFER_SIZE,
PIPE_BUFFER_SIZE,
PIPE_TIMEOUT,
NULL
);
if (hPipe == INVALID_HANDLE_VALUE)
{
return GetLastError();
}
OVERLAPPED ol;
//DWORD dwWait;
ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if(ol.hEvent == NULL)
{
return GetLastError();
}
if(ConnectNamedPipe(hPipe, &ol) == 0)
{
//error should be ERROR_IO_PENDING or ERROR_PIPE_CONNECTED
DWORD err = GetLastError();
//wait for the connection event
if (err != ERROR_IO_PENDING && err != ERROR_PIPE_CONNECTED) {
if (WaitForSingleObject(ol.hEvent, pipe_settings->pipe_timeout) != WAIT_OBJECT_0) {
CloseHandle(hPipe);
CloseHandle(ol.hEvent);
return err;
}
}
}
pipe_settings->hPipe = hPipe;
pipe_settings->ol.Pointer = ol.Pointer;
pipe_settings->ol.Offset = ol.Offset;
pipe_settings->ol.Internal = ol.Internal;
pipe_settings->ol.hEvent = ol.hEvent;
pipe_settings->ol.InternalHigh = ol.InternalHigh;
pipe_settings->ol.OffsetHigh = ol.OffsetHigh;
return ERROR_SUCCESS;
}
DWORD WINAPI ClientProc(LPVOID)
{
struct pipe_settings pipe_settings;
pipe_settings.name = TEXT(DUST_TEST_PIPE_NAME);
pipe_settings.pipe_timeout = PIPE_TEST_TIMEOUT;
DWORD err = PipeListenForServerConnect(&pipe_settings);
//EXPECT_EQ((DWORD)ERROR_SUCCESS, err);
WINBOOL pipe_close_success = PipeClose(&pipe_settings);
//EXPECT_NE(1, pipe_close_success);
return 0;
}
DWORD WINAPI ServerProc(LPVOID)
{
struct pipe_settings pipe_settings;
pipe_settings.name = TEXT(DUST_TEST_PIPE_NAME);
pipe_settings.pipe_timeout = PIPE_TEST_TIMEOUT;
DWORD err = PipeConnectToClient(&pipe_settings);
//EXPECT_EQ((DWORD)ERROR_SUCCESS, err);
WINBOOL pipe_close_success = PipeClose(&pipe_settings);
//EXPECT_NE(0, pipe_close_success);
return 0;
}
int main(void) {
DWORD dwThreadId1;
DWORD dwThreadId2;
HANDLE h1 = CreateThread(NULL, 0, ServerProc, NULL, 0, &dwThreadId1);
HANDLE h2 = CreateThread(NULL, 0, ClientProc, NULL, 0, &dwThreadId2);
WaitForSingleObject(h1, INFINITE);
WaitForSingleObject(h2, INFINITE);
// your code goes here
return 0;
}
最佳答案
CreateEvent()
不使用 INVALID_HANDLE_VALUE
来表示无效句柄,而是使用 NULL
来代替。因此,您需要将 InitializePipeSettings()
初始化 ol.hEvent
为 NULL
:
void InitializePipeSettings(struct pipe_settings *pipe_settings)
{
pipe_settings->hPipe = INVALID_HANDLE_VALUE;
pipe_settings->ol.hEvent = NULL; // <-- here
pipe_settings->ol.Internal = 0;
pipe_settings->ol.InternalHigh = 0;
pipe_settings->ol.Offset = 0;
pipe_settings->ol.OffsetHigh = 0;
pipe_settings->ol.Pointer = NULL;
}
然后在 PipeClose()
中,您需要在调用 CloseHandle()< 之前检查每个句柄是否有
就可以了。您还应该让 INVALID_HANDLE_VALUE
/NULL
/PipeClose()
重置其关闭的句柄,以便可以在同一个 pipe_settings
上安全地多次调用 PipeClose()
>:
WINBOOL PipeClose(struct pipe_settings *pipe_settings)
{
BOOL bResult = TRUE;
if (pipe_settings->ol.hEvent != NULL)
{
bResult = bResult && CloseHandle(pipe_settings->ol.hEvent);
pipe_settings->ol.hEvent = NULL;
}
if (pipe_settings->hPipe != INVALID_HANDLE_VALUE)
{
bResult = bResult && CloseHandle(pipe_settings->hPipe);
pipe_settings->hPipe = INVALID_HANDLE_VALUE;
}
return bResult;
}
关于c - 开放管道上 CloseHandle 上的 sigsegv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32189856/
这个问题是针对 Linux 提出的。使用 GCC 编译器。 如果 SIGSEGV(我的意思是通常会导致 SIGSEGV 的违规行为)发生在旨在捕获 SIGSEGV 的信号处理程序中,可以预期会有什么行
我正在构建一个 C++ 程序,我需要在其中处理 SIGSEGV 并且信号处理程序应该能够打印回溯。任何人都可以帮忙吗。 问候 最佳答案 获得 SIGSEV 回溯的最好方法是生成核心文件而不是打印回溯。
我有一个屏幕A,在执行了一些POST API任务后,我启用了一个按钮,然后单击按钮导航到屏幕B。当Reaction Native应用程序冻结并崩溃时,崩溃会随机发生。从其他屏幕导航到屏幕B也不是问题,
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我正在编写这个方法(C 语言),它应该为链表创建一个新节点。它在第一个 if (SIGSEGV 信号)之后的行崩溃 我正在调试该方法,因此后续行中可能会有更多错误,但目前我将感谢有关此特定行的任何观察
这是我的比较函数: int compareInts(const void *a, const void *b) { const int *pa = (const int*)a; con
我一直在研究一些有缺陷的代码,并想安装一个 SIGSEGV 处理程序来获取有关崩溃的更多信息。但是,我注意到我的处理程序没有被调用。 我一直在寻找原因,它似乎与损坏的堆栈指针值有关(它肯定没有被屏蔽)
我是编码新手。当我在 codecheff 中提交代码时,它给出“运行时错误(SIGSEGV)”。我不知道有什么问题请帮忙。提前致谢。 int call(int *x, int m) { int
CodeChef 问题: Shivam 是世界上最年轻的程序员,他只有 12 岁。 Shivam 正在学习编程,今天他正在编写他的第一个程序。 程序很简单,给定两个整数A和B,编写一个程序将这两个数字
我正在编写一个编程问题的解决方案。问题如下: Your program is to use the brute-force approach in order to find the Answer t
好吧,只是为了好玩,我正在研究埃拉托色尼筛。它最初运行良好,因此我寻求提高其运行时复杂性。现在,我不知道为什么,但我遇到了段错误。代码如下: #include #include int main(
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在创建一个简单的链表程序来插入和查看 LL 的元素。当我尝试插入第二个元素时,它给出 SIGSEV,但我不明白为什么?!! 请帮我指出问题: main.c: #include #includ
我试图提交此代码以解决 hackerearth 上的问题,但我得到了此 SIGSEGV 运行时错误。我读到了这个错误,但我无法让我的代码工作。有人说这是由于无效的内存引用、数组的动态初始化或数组索引超
我正在思考 leetcode 问题 167,但我的代码遇到了段错误 (SIGSEGV) 问题。下面是我的c代码,预期的答案是[1,3]。 #include #include /** * Return
我有一个在ARM平台上运行的多线程程序。在其中一个线程中,我将调用 system() 来运行某些 shell 命令。最近,我发现有时候,由system() fork 的子进程会以SIGSEGV终止。
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我很高兴知道为什么我遇到此错误 http://www.codechef.com/problems/AXR1P2在 codechef.com 中,我的代码是... #include #include i
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在使用 POSIX 套接字在 Android 上编写一些网络代码,但是当我调用 Sento 时,我收到了一个奇怪的 SIGSEGV(信号 11,代码 1)。我已经使用墓碑跟踪来确定它是哪一行,但坦
我是一名优秀的程序员,十分优秀!