在信号处理程序中使用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(&
我正在清理存储在文本文件中的数据。每一行的开头都是一个类别标签,后面跟着我想要清理的实际数据。在不同的子文件夹中有许多文本文件,所以我使用egrep将文件名传递给sed。
CON: the Unix and Linux question
SEM: eins, the zwei, drei
AUTH: , the
AFF: The holy seat
TTITLE: As we go, the Kuckuck comes too
现在,在以(SEM|AFF|CON)开头的每一行中,当(T|t)he[ ]*跟随(:|\,)时,我想替换它。也就是说,数据应该稍后看起来像
CON: Unix and
我正在编写一个Linux char驱动程序,我想在驱动程序关闭时释放一个信号量。问题是,我不能确定用户是否已经获取了信号量。执行此操作的适当方式是什么?
/* Not my code, but demonstrates the problem I face */
if (userland_var)
down(&my_sem);
/* ... */
/* Okay, now I want to release this semaphore, if held,
but I don't know the value of userland_var */
/* OPTI
我对Linux API sem_unlink()有点困惑,主要是在什么时候或为什么调用它。我在Windows中使用信号量已经很多年了。在Windows中,一旦关闭了命名信号量的最后一个句柄,系统就会删除底层内核对象。但是在Linux中,开发人员需要通过调用sem_unlink()来删除内核对象。如果不这样做,内核对象将保留在/dev/shm文件夹中。
我遇到的问题是,如果进程A调用sem_unlink(),而进程B锁定了信号量,它会立即销毁信号量,现在当进程C出现时,进程B不再受信号量的“保护”。更重要的是,手册页充其量也是令人困惑的:
“信号量名称将立即删除。一旦打开信号量的所有其他进程将其
我有一个更大的多线程软件(专有的和不能共享的),它报告了一个来自below的数据竞赛(请参阅下面的数据竞赛)。我不能分享这个软件,但我设计了一些测试来演示比赛。
与实际软件的竞争有问题:
==7746== Possible data race during write of size 1 at 0xAC83697 by thread #4
==7746== Locks held: 2, at addresses 0x583BCD8 0x5846F58
==7746== at 0x4C3A3CC: mempcpy (in /usr/lib/valgrind/vgpreload_helgri