gpt4 book ai didi

c - 什么 child 不从其 parent 那里继承信号量调整(semop(2))是什么意思?

转载 作者:行者123 更新时间:2023-12-01 13:47:50 24 4
gpt4 key购买 nike

fork 中的这一行(doc)引起了我的注意:

  • 子项不会从其父项 (semop(2)) 继承信号量调整。

这是什么意思?

这个程序(下面的代码)永远不会打印“End (child)”:

 #define SVID_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int argc, char **argv) {

struct sembuf operation;
int semid = semget (getpid(), 1, 0666 | IPC_CREAT);
semctl (semid, 0, SETVAL, 1);

if (fork() == 0) {
sleep(1); // Let the father do semop()
operation.sem_num = 0;
operation.sem_op = -1;
operation.sem_flg = 0;
semop (semid, &operation, 1);
printf("End (child).\n");
exit(0);
}

operation.sem_num = 0;
operation.sem_op = -1;
operation.sem_flg = 0;
semop (semid, &operation, 1);
wait (NULL);
printf("The end.\n");

return 0;
}

最佳答案

首先,有两个独立的信号量子系统:旧式 System V 信号量和 POSIX 信号量。不要因为两者都是 POSIX 的一部分而感到困惑。与问题相关的是 System V 信号量。

semop(2)系统调用是用于操作系统 V 信号量集中的值的调用。通过此函数修改信号量集的进程可以通过在参数中包含一个特定标志(由 SEM_UNDO 表示)的方式在进程退出时自动撤消。这会导致该信号量集的一组“信号量调整”与进程相关联。正是这些调整不会通过 fork 继承,这是有道理的,因为如果它们被继承,那么撤消将执行两次——一次是在子进程退出时,一次是在父进程退出时。

POSIX 信号量通常被认为可以提供更好的 API,通常它们应该比系统 V 信号量更受青睐,但了解两者会很有帮助。

关于c - 什么 child 不从其 parent 那里继承信号量调整(semop(2))是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34452654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com