小编rm5*_*248的帖子

Java信号链

我有一个带有专门Process类的程序,它在Linux上本地处理执行进程.

它根本不使用Java的Process类,因为它需要对进程进行一些特殊处理.因此,它还安装了自己的信号处理程序SIGCHLD,以便它知道进程何时退出.

但是,我刚刚Runtime.exec()在我的代码中添加了一个调用,它显然安装了自己的信号处理程序SIGCHLD,这意味着我再也没有得到它SIGCHLD,这很糟糕.我遵循了oracle的信号链接指令,但同样的问题发生了,我从来没有得到过SIGCHLD.

所以,基本问题是:是否有可能SIGCHLD在Java中链接?

java linux runtime-environment signal-handling sigchld

19
推荐指数
1
解决办法
1524
查看次数

C++ 映射访问上的段错误

我在正在处理的一些代码中遇到了一个奇怪的问题。基本上发生的事情是,每当我尝试从空地图中获取一些信息时,程序都会出现段错误。下面是相关代码:(注意struct Pair是前面定义的数据结构,sendMasks是一个std::map就好了)

std::map<std::string*, struct Pair*>::iterator it;
for(it = sendMasks->begin(); it != sendMasks->end(); it++){ //segfault
   //(some code goes here)
}
Run Code Online (Sandbox Code Playgroud)

我知道指向地图的指针是好的;我可以

it = sendMasks->begin();
it = sendMasks->end();
Run Code Online (Sandbox Code Playgroud)

在我的循环之前,它根本不会出现段错误。

现在,如果我在 for 循环之前进行以下测试,它将出现段错误:

if( sendMasks->empty() )
Run Code Online (Sandbox Code Playgroud)

与任何其他确定地图是否为空的尝试一样。

仅当地图为空时才会出现此问题。我对这个问题的唯一想法是,因为我在单独的线程中更新 sendMasks,所以它可能没有正确更新;然而,这没有任何意义,因为只有当地图为空时才会发生这种情况,并且这段代码之前工作得很好。关于可能发生的事情还有其他想法吗?

编辑: 我弄清楚问题是什么了。

在代码的前面部分,我创建了一个新的 char* 数组,并将该指针放入另一个长度为 4 的数组中。然后,我在新数组的末尾放置了一个 NULL 字符,但意外地只做了一个下标第一个数组 - 它超出了数组的末尾并覆盖了指针。不知怎的,这偶尔能正常工作。(valgrind 没有检测到这个问题)

顺序是这样的:

object* = NULL;  //(overwritten memory)
object->method();

//Inside object::method() : 
map->size(); //segfault.  Gets an offset of 0x24 into the object, 
             //which is NULL to begin with.  memory location 0x24 = invalid
Run Code Online (Sandbox Code Playgroud)

我没想到对象本身的实例为空,因为在 …

c++ dictionary

7
推荐指数
1
解决办法
1万
查看次数

本机方法同步

我有一个像这样定义的本机方法方法:

public static native int doSomething();
Run Code Online (Sandbox Code Playgroud)

但是,此方法不是线程安全的.所以,我synchronized在其上放了一个关键字,所以它现在看起来像这样:

public static synchronized native int doSomething();
Run Code Online (Sandbox Code Playgroud)

这似乎解决了这个问题,但我不确定它是否确实存在.这有效吗?它实际上是否正确锁定了对方法的访问权限?

java synchronization

4
推荐指数
1
解决办法
3104
查看次数