在信号处理程序中使用sem_post()是否依赖于未定义的行为?
/*
* excerpted from the 2017-09-15 Linux man page for sem_wait(3)
* http://man7.org/linux/man-pages/man3/sem_wait.3.html
*/
...
sem_t sem;
...
static void
handler(int sig)
{
write(STDOUT_FILENO, "sem_post() from handler\n", 24);
if (sem_post(&
根据甲骨文的,在信号处理程序内部使用fork()应该是安全的.但是我的进程被卡在信号处理程序中,并跟踪跟踪:
#0 __lll_lock_wait_private () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95
#1 0x00007f86e6a9990d in _L_lock_48 () from /lib/x86_64-linux- gnu/libc.so.6
#2 0x00007f86e6a922ec in ptmalloc_lock_all () at arena.c:242
#3 0x00
首先,对不起,在信号处理程序中调用malloc :).I也明白,我们不应该在信号处理程序中执行任何耗时的任务/这种讨厌的事情。
但我很想知道它坠毁的原因?
#0 0x00006e3ff2b60dce in _lll_lock_wait_private () from /lib64/libc.so.6
#1 0x00006e3ff2aec138 in _L_lock_9164 () from /lib64/libc.so.6
#2 0x00006e3ff2ae9a32 in malloc () from /lib64/libc.so.6
#3 0x00006e3ff1f691ad
我正在尝试在POSIX中移植来自ExpressLogic的实时Thread_Metric,以便为我的论文测试用于Linux、Xenomai和RTAI的PREEMPT_RT补丁。它们提供了一个具有以下功能的C源文件,您必须实现这些功能才能使基准测试正常工作:
void tm_initialize(void (*test_initialization_function)(void));
int tm_thread_create(int thread_id, int priority, void (*entry_function)(void));
int tm_thread_resu
每一个人,当我使用fork和signal做一些实验时,我遇到了一个程序,它显示了非常有趣的行为,但经过几个小时的努力,我无法弄清楚发生了什么。
我尝试做的是在主体中创建子进程,然后打印"hello world“,然后调用exit。在此之后,完全可以理解,它的信号处理程序将被调用,被等待系统调用阻塞的父进程也将被调用。现在,我在信号处理程序中创建了另一个进程,但从那时起,输出将变为无穷大。
输出是这样的: Hello world to Linux to UNIX ...
还有为什么Linux一次又一次地打印出来。
另外,当fork被调用时,请告诉我,我知道重复的地址空间是由父对象构成的,
我正在编写的代码有很多调用来创建新的字符串之类的东西。但最近在将服务器升级到12.10 Ubuntu后,我开始遇到一些麻烦。一些子进程会卡在futex中。因此,我将GDB附加到在futex中运行了很长一段时间的进程,我执行了一个backtrace,并找到了以下日志
#0 0x00007f563afc69bb in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007f563af4a221 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#2 0x00007f563af47fa7 in mal
我在服务器端有使用共享数据的方法,我需要同步不同请求之间的数据访问。例如。
BrowserClient1_Calling_Method1()
{
//This should be an XHR call and it waits for the result.
}
BrowserClient2_Calling_Method2()
{
//This should be an XHR call and it waits for the result.
}
在服务器端,我有两个方法需要一个一个地调用。
//When ever this method is called, put