【问题标题】:linux semaphore, can a process block itself?linux信号量,进程可以自己阻塞吗?
【发布时间】:2011-05-26 09:44:39
【问题描述】:

我使用semget()获取一个semaphore,并将其VAL初始化为0,然后我想用semop()等待它,但它直接返回。 (另外一个流程是为了获取SEM,经过一些操作后释放)

但是如果我得到一个 SEM 并在一个进程中将它的 VAL 初始化为 0,然后在另一个进程中等待它,它就可以工作。

这是否意味着一个进程不能阻塞自己?

谢谢!!!

像这样:

int semid = semget(IPC_PRIVATE, 1, IPC_CREAT);
union semun su;
su.val = 0;
semctl(semid, 1, SETVAL, su);
struct sembuf sb;
sb.sem_num = 0;
sb.sem_op  = -1;
sb.sem_flg = 0;
semop(semid, &sb, 1);

【问题讨论】:

  • 如何创建信号量?你能显示一些代码吗?

标签: c linux unix ipc semaphore


【解决方案1】:

据我目前所见,您应该:

  1. 将信号量初始化为 1 (su.val)

  2. 调用 semop 并将 sb.sem_op 设置为 0(即等待计数器降为零)。

  3. 在其他进程中删除计数 (sem_op = -1)。

因为您使用 0 初始化信号量并调用它以将其减一(信号量永远不会低于零),所以您的等待调用将成功并且您的进程不会阻塞。 这有帮助吗?

也许这可能会提供额外的见解:

http://linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html?page=2

【讨论】:

  • 谢谢!!有用!!但我仍然很困惑为什么将 su.val 初始化为 0 会阻塞另一个进程。换句话说,一个进程怎么会阻塞自己。我是 *nix 的新手。再次感谢您的帮助和网络文档。
  • 这是因为如果进程用0初始化一个信号量,它会同时进入临界区;所以其他人必须等待。如果您在项目中编写绿色(新)代码,也许您应该考虑改用 POSIX 信号量(如链接文章中所述),因为代码更容易维护(更不言自明)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多