在Windows上,子进程可以继承大多数句柄.期望TCP套接字也可以继承.但是,当安装某些分层服务提供程序时,这不会按预期工作(来自Symantec的A/V产品,例如来自Symantec的PCTools,会导致我们的客户应用程序出现问题).
微软构建WinSock的方式,我们是否应该能够正确地继承SOCKET?
在C和C++,atexit函数的调用任一内部exit或之后main返回(其名义上调用exit:__libc_start_main(argc,argv) { __libc_constructors(); exit(main(argc,argv)); }).
有没有办法找出我们是否在退出序列内?注册了C++全局和局部静态的析构函数atexit,因此您的代码在此阶段肯定可以调用.(有趣的是,在某些平台上,如果你试图在里面创建一个C++本地静态对象exit,它会在退出锁上死锁!)
到目前为止,我最好的尝试如下:
static bool mainExited = false;
static void watchMain() {
static struct MainWatcher {
~MainWatcher() { mainExited = true; }
} watcher;
}
Run Code Online (Sandbox Code Playgroud)
当您想要注意退出时,您可以随时调用watchMain()并mainExited告诉您退出序列是否已经开始 - 当然,如果稍后初始化的本地静态对象正在破坏!
可以改进技术来纠正这个问题,还是有另一种方法可行?
虽然从语言的角度来看这个问题很有意思(有点像"我可以判断我是否在一个catch区块内吗?"),但概述一个用例也很有用.我在编写一些代码时遇到了这个问题,这些代码将在加载JVM和没有加载JVM的情况下运行(直接调用或通过JNI调用).JVM退出后,将atexit调用C 处理程序,JNI_OnUnload如果类加载器未卸载JNI共享库,则不会调用它们.
由于共享库的对象可以通过显式销毁(并且应该释放它们的资源)来破坏,并且通过在退出时清理,我需要安全地区分这两种情况,因为当我们到达退出代码时JVM就消失了!基本上没有一点嗅探,我无法在JNI规范/文档中找到共享库来了解JVM是否仍然存在,如果它已经消失,那么尝试释放我们的引用肯定是错误的到Java对象.
在Java中,所有标准的阻塞方法都可以通过调用来中断Thread.interrupt(),但是如果我们有Java绑定包装一个自己进行I/O的本机库呢?那么本机代码应该如何挂钩到线程并响应调用Thread.interrupt()?
java java-native-interface multithreading interrupted-exception
我在C中编写了一个简单的程序,并在Ubuntu上使用GCC编译它.这个文件会在另一台机器上运行吗?
显然,在安装了"RSA Authentication Agent"的Windows机器上,可以利用它来提供身份验证服务.似乎有一些文档/ SDK用于执行此操作.似乎可以静态链接此功能,或通过调用从"aceclnt.dll"导出的某些函数动态加载它.
但是,由于RSA的网站已移至emc.com,因此旧网站的所有链接均已失效.我无法在新网站上找到任何文档.请帮我google吧!
我们可以通过PAM在UNIX/Linux上的应用程序中轻松使用SecurID身份验证.它只在Windows上,我们需要使用一些特殊的SecurID API来查询是否接受/拒绝凭据.
在规范和两个实现中:
dup2()可能会返回 EINTR。实际上,Linux 可以返回 EINTR 吗dup2()?如果是这样的话,大概是因为close()决定等待并且信号到达(TCP 延迟或狡猾的文件系统驱动程序在关闭时尝试同步)。
实际上,FreeBSD 能保证不返回 EINTR 吗dup2()?在这种情况下,它一定不会等待旧 fd 上的任何未完成的操作,而是简单地取消链接该 fd。
当POSIXdup2()指的是“关闭”(不是斜体)而不是指实际的函数时,它意味着什么close()- 我们是否理解它只是以非正式的方式谈论“关闭”它(取消文件描述符的链接),或者它是试图说效果应该就像close()首先调用该函数然后dup2()以原子方式调用一样。
如果fildes2已经是一个有效的打开文件描述符,则应首先关闭它,除非fildes等于fildes2,在这种情况下,dup2()应返回fildes2而不关闭它。
如果dup2() 必须关闭、等待,然后自动复制,这对于实现者来说将是一场噩梦!这比惨败的 EINTR 还要糟糕得多close()。胆怯的 POSIX 甚至没有说在 EINTR 的情况下是否发生了重复......
struct {
uint64_t a; char z[120];
} b;
...
struct buffer_with_alignment_requirement* c = (struct buffer_w*)&b;
c->start_using_it;
Run Code Online (Sandbox Code Playgroud)
如果没有第一个成员a,我们可能会在访问缓冲区中的字段时崩溃.简单地添加这样的成员以强制整个结构的对齐是否足够严格,是否可移植且正确?
这不是关于指针别名的问题,只是关于b堆栈上的地址是否总是八字节对齐.
官方API文档太稀疏了(这里).至少有一个未列出的属性,您可以在发帖时非常有用.这是一个自我回答的问题,用于记录"属性"字段,因为我无法找到有关SO的所有信息.
我正在写一个遗传算法来解决Master Mind游戏.我已经对最佳方法进行了大量研究,拥有多样化的人口非常重要.我正在尝试确定如何在C++中获得非常好的随机数.我已经srand(time(NULL))在我的程序开始时设置种子然后我只是使用了rand().我想知道的是这是多么随机?它不错吗?是否还有其他更好的随机数库?
我知道数论和随机性是一个非常复杂的主题; 在编写自己的版本时,你有什么指针rand()吗?
我正在寻找一种获得保证单调时钟的方法,它可以排除暂停期间所花费的时间,就像POSIX一样CLOCK_MONOTONIC.
需要Windows 7(或更高版本)的解决方案是可接受的.
这是一个不起作用的例子:
LONGLONG suspendTime, uiTime1, uiTime2;
do {
QueryUnbiasedInterruptTime((ULONGLONG*)&uiTime1);
suspendTime = GetTickCount64()*10000 - uiTime1;
QueryUnbiasedInterruptTime((ULONGLONG*)&uiTime2);
} while (uiTime1 != uiTime2);
static LARGE_INTEGER firstSuspend = suspendTime;
static LARGE_INTERER lastSuspend = suspendTime;
assert(suspendTime > lastSuspend);
lastSuspend = suspendTime;
LARGE_INTEGER now;
QueryPerformanceCounter(&now);
static LONGLONG firstQpc = now.QuadPart;
return (now.QuadPart - firstQpc)*qpcFreqNumer/qpcFreqDenom -
(suspendTime - firstSuspend);
Run Code Online (Sandbox Code Playgroud)
这个(我的第一次尝试)的问题是GetTickCount每15ms只会打勾,而且QueryUnbiasedInterruptTime似乎更频繁地打勾,所以我的方法偶尔会观察暂停时间稍微回过头来.
我也尝试过使用CallNtPowerInformation,但目前尚不清楚如何使用这些值来获得一个不错的,无竞争的暂停时间度量.
我想要一种在shell脚本中编写守护进程的方法,该脚本在循环中运行另一个应用程序,如果它死了则重新启动它.
./myscript.sh从SSH会话运行时,它将启动守护程序的新实例,除非该守护程序已在运行../myscript -stop)可以杀死任何现有的守护进程.(关于编辑的注意事项 - 原始问题指出nohup并且可能不使用类似工具.这个人工要求是一个"XY问题",并且接受的答案实际上使用了OP声称无法使用的所有工具.)
我想我已经在整个互联网上搜索了一个简单的进度条,但我找不到一个在函数/子完成后取得进展的东西.
我将在下面的代码中演示我想要的内容.我对VBA的了解是基本的,也是这样的.
我有一个表单,有一个按钮,当我点击按钮时,他应该执行这个:
Sub program()
progressbarform.show
Call function1
"set progressbar to 20%"
Call funcion2
"set progressbar to 40%"
Call function3
"set progressbar to 100%"
"Unload progressbar form"
End Sub
Run Code Online (Sandbox Code Playgroud)