semaphore

内核如何实现文件访问的同步技术
semaphore

内核如何实现文件访问的同步技术

我读到内核在访问文件时实现了同步机制。例如,如果我们尝试同时使用read()或从不同的进程写入或读取文件系统中的文件,内核将防止竞争条件。write() 具体是如何实施的?我在编写代码时使用过互斥体和信号量,这可以防止不同的线程或进程同时执行代码的某一部分。 在这种情况下,我假设内核应该仅在多个进程或线程尝试读取或写入同一文件描述符时实现一种锁定机制,而不是任何时候read()或被write()调用,这可能适用于任何文件描述符。如何实现这一目标? ...

Admin

如何打开现有的命名信号量?
semaphore

如何打开现有的命名信号量?

显然,当打开现有信号量时,O_CREAT和O_EXCL不是必需的。 O_CREAT创建新信号量时需要。 O_EXCL仅当与 进行 OR 运算时才有意义O_CREAT,指定如果具有给定名称的信号量已存在,则返回错误。 sem_open 的 Linux 手册页说 可以通过包含 <fcntl.h> 来获取标志值的定义 但我没有找到任何标志fcntl.h这告诉我如何打开现有的信号量。 ...

Admin

基于 FIFO 的信号量解释
semaphore

基于 FIFO 的信号量解释

我正在尝试对许多进程进行一些并行化(任务发送/在许多(比如说数百个)节点上执行)。我遇到了这个解决方案: https://unix.stackexchange.com/a/216475 # initialize a semaphore with a given number of tokens open_sem(){ mkfifo pipe-$$ exec 3<>pipe-$$ rm pipe-$$ local i=$1 for((;i>0;i-...

Admin

GNU 并行 Python 信号量
semaphore

GNU 并行 Python 信号量

我有一个通过 GNU 并行并行化的 Python 脚本,它找到了我想要输出到文件的某个结果,目前我通过标准 Python 文件 IO 来执行此操作。问题是我在每个并行线程中打开这个文件,并且线程在写入时互相踩着脚趾。我想实现一个 FIFO 信号量,我认为它必须在 GNU 并行脚本中,但是如果我从 Python 中访问文件,我不确定如何做到这一点。我当前的脚本是: #!/bin/bash time parallel -j$(nproc) -N0 python3 ./polynomial_generator.py ::: {1..10} --progress...

Admin

限制并行 Bash 脚本中的线程数
semaphore

限制并行 Bash 脚本中的线程数

我尝试使用信号量改进我使用的一些照片处理脚本。我运行 sable GNU/DEBIAN 有一个名为 travail 的函数,它使用给定的文件名作为参数,并处理该文件。 目前,该函数在同一脚本中通过循环调用: for i in *.png ; do travail $i & done 问题是如果有很多图片,它会使用大量内存。我想使用信号量来限制线程数量。 我试过: for i in *.png ; do sem -j+0 travail $i done sem --wait 但它不起作用,并显示以下消息: /bin/...

Admin

从 shell 脚本中的信号量获取并返回许可
semaphore

从 shell 脚本中的信号量获取并返回许可

在 shell 脚本中我可以使用: ipcmk -S 4 创建一个具有 4 个槽的信号量。我ipcrm可以再次删除信号量。但我该如何使用它呢?我找不到任何 semwait、ipcsemget 或类似的。这是怎么做到的? ...

Admin

proc1.sh
semaphore

proc1.sh

proc1.sh #!/bin/sh touch /tmp/proc1.signature.mutex #do something for long time sleep 100 rm -rf /tmp/proc1.signature.mutex proc2.sh #!/bin/sh touch /tmp/proc2.signature.mutex #do something for long time sleep 100 rm -rf /tmp/proc2.signature.mutex pr...

Admin

当多个 apache 实例在机器上使用相同的应用程序 id 运行时,如何获取特定 apache 实例的信号量和共享内存对象
semaphore

当多个 apache 实例在机器上使用相同的应用程序 id 运行时,如何获取特定 apache 实例的信号量和共享内存对象

不确定这个问题是否与本论坛相关。 我们有一个服务器,有 3 个 apache 实例,使用“相同”的应用程序/功能 ID 运行 这些实例使用同一个盒子上的进程间通信与其相应的 Siteminder webagents 进行通信。 现在,当我执行 ipcs 命令来查找信号量和共享内存对象时,它会显示“所有”对象,并且我不确定使用 ipcrm 命令删除哪些对象。 有没有办法只显示特定 apache 实例正在使用的实例? 我知道更好的选择是为 apache 实例提供 3 个不同的应用程序 ID,而不是 1 个。 ...

Admin

如何同步未命名 POSIX 信号量的初始化?
semaphore

如何同步未命名 POSIX 信号量的初始化?

为了在多个进程中使用未命名的 POSIX 信号量,必须创建/获取对共享内存一部分的访问权限。之后,一个进程必须通过sem_init将对共享内存的引用作为第一个参数进行调用来初始化信号量。但是,此操作只允许进行一次! POSIX说: 尝试初始化已初始化的信号量会导致未定义的行为。 问题在于,无法以原子方式测试信号量是否已存在并已初始化,以及如果不存在则对其进行初始化。 人们可能会想简单地向共享内存添加一个布尔标志,以指示信号量是否已初始化,但这显然会产生竞争条件 - 在使用信号量时,这是人们绝对不希望看到的:) XSI(又名 System V...

Admin

命名信号量存储在哪里?
semaphore

命名信号量存储在哪里?

命名信号量(使用semaphore.h)由以下形式的名称标识/somename;也就是说,最多包含 NAME_MAX-4(即 251)个字符的以 null 结尾的字符串,其中包含一个初始斜杠,后跟一个或多个字符,但这些字符都不是斜杠。 因为名称对应于文件系统中的路径名。这个信号量位于哪里?ipcs用于 System V 信号量。如何定位 POSIX 信号量? ...

Admin

在 bash 中的文件中执行原子写入操作
semaphore

在 bash 中的文件中执行原子写入操作

经历了狂欢之后文档,这问题和这我仍然不清楚如何在 bash 中对文件执行原子写入(追加)操作。我有一个在多个实例中运行的脚本,并且在某些时候必须将数据写入文件: echo "$RESULT" >> `pwd`/$TEMP_DIR/$OUT_FILE 如何使所有并发运行的脚本对该文件的所有写入操作成为原子的(以便一个实例的数据不会与另一个实例的数据重叠)? ...

Admin

进程等待信号量
semaphore

进程等待信号量

如果我有一个处于睡眠状态的进程,并且我可以在psWCHAN 列中看到正在等待获取信号量,有什么方法可以找到该信号量的地址吗? ...

Admin

如何调试 semop 失败?
semaphore

如何调试 semop 失败?

使用Linux执行2.6.30-gentoo-r4非常复杂的代码系统(使用 4.4.9-pl0-gentoo 和 5.2.10-pl0-gentoo),偶尔会遇到信号量阻塞问题。对函数php的调用被阻止,最终导致系统崩溃。phpsem_acquire 然而,这个有问题的信号量似乎没有被另一个php进程阻止,这促使我进一步调查。我能够识别php有问题的进程及其strace,导致阻塞信号量: .... 09:03:25 gettimeofday({1415696605, 778078}, NULL) = 0 09:03:25 close(5) ...

Admin