草庐IT

semaphore

全部标签

c - 如果 sem_init() 被调用两次会发生什么?

sem_init()的手册页说“初始化已经初始化的信号量会导致未定义的行为。”为什么会这样?在Linux上究竟会发生什么?这对我来说没有意义,因为当您第一次调用sem_init()时,(未初始化的)sem_t可能具有与已初始化的sem_t完全相同的内容——如果手册是正确的,那么sem_init()只是不起作用。 最佳答案 在Linux上,信号量是在没有任何系统资源的情况下实现的,sem_init只是填充了sem_t结构成员,所以如果它被调用不止一次也不会发生什么坏事.但是,一般来说,可能会发生更糟糕的事情。如果sem_t只是一个包含

c - 如果 sem_init() 被调用两次会发生什么?

sem_init()的手册页说“初始化已经初始化的信号量会导致未定义的行为。”为什么会这样?在Linux上究竟会发生什么?这对我来说没有意义,因为当您第一次调用sem_init()时,(未初始化的)sem_t可能具有与已初始化的sem_t完全相同的内容——如果手册是正确的,那么sem_init()只是不起作用。 最佳答案 在Linux上,信号量是在没有任何系统资源的情况下实现的,sem_init只是填充了sem_t结构成员,所以如果它被调用不止一次也不会发生什么坏事.但是,一般来说,可能会发生更糟糕的事情。如果sem_t只是一个包含

linux - linux 在终止进程时是否释放自旋锁/信号量?

如果一个进程持有一些自旋锁或信号量,并意外退出(例如,被linux杀死),linux会正确释放这些锁吗?如果linux不做这项工作,为什么? 最佳答案 这取决于您所谈论的锁的类型。如果您谈论的是任何类型的内核内部锁,它们将在适当的时候被释放(否则您的系统很快就会崩溃)。通常,这些类型的锁不属于进程本身,而属于某些内部内核工作流,并且通常不会在进程返回用户空间后保持锁定状态。但是请注意,如果在您发出kill命令时内核已经死锁,则进程很可能不会被终止。进程终止是作为信号处理路径的一部分执行的,它是从内核到用户空间的返回转换代码调用的。如

linux - linux 在终止进程时是否释放自旋锁/信号量?

如果一个进程持有一些自旋锁或信号量,并意外退出(例如,被linux杀死),linux会正确释放这些锁吗?如果linux不做这项工作,为什么? 最佳答案 这取决于您所谈论的锁的类型。如果您谈论的是任何类型的内核内部锁,它们将在适当的时候被释放(否则您的系统很快就会崩溃)。通常,这些类型的锁不属于进程本身,而属于某些内部内核工作流,并且通常不会在进程返回用户空间后保持锁定状态。但是请注意,如果在您发出kill命令时内核已经死锁,则进程很可能不会被终止。进程终止是作为信号处理路径的一部分执行的,它是从内核到用户空间的返回转换代码调用的。如

Linux IPC选择?

我有两个进程A和B。A和B有时需要通信(双向)以传递信号、消息等。我对Linux中可用的IPC进行了一些基础研究,例如信号量、消息队列、dbus等。现在我在决定使用哪一个时感到困惑,谁能告诉我哪个IPC更适合我的应用程序?提前致谢已编辑:阐述应用程序。(这是一个嵌入式应用程序)进程A将监控温度、速度计算等。进程B将驱动电机、读取传感器值(数字)等。有时我需要向进程B发送信号,告知已达到最高温度,因此停止驱动电机。有时需要将从进程A中的传感器读取的数据发送到进程B。像这样,数字数据需要跨进程传递。我正在ARM架构中执行此操作。 最佳答案

Linux IPC选择?

我有两个进程A和B。A和B有时需要通信(双向)以传递信号、消息等。我对Linux中可用的IPC进行了一些基础研究,例如信号量、消息队列、dbus等。现在我在决定使用哪一个时感到困惑,谁能告诉我哪个IPC更适合我的应用程序?提前致谢已编辑:阐述应用程序。(这是一个嵌入式应用程序)进程A将监控温度、速度计算等。进程B将驱动电机、读取传感器值(数字)等。有时我需要向进程B发送信号,告知已达到最高温度,因此停止驱动电机。有时需要将从进程A中的传感器读取的数据发送到进程B。像这样,数字数据需要跨进程传递。我正在ARM架构中执行此操作。 最佳答案

c - 如何在 C 中多次调用 sem_open?

我在使用C语言使信号量在基于Linux的系统上工作时遇到了很多困难。我的申请流程是这样的:申请开始申请分支到child/parent每个进程使用具有共同名称的sem_open打开信号量。如果我在fork之前创建信号量,它工作正常。但是,要求阻止我这样做。当我第二次尝试调用sem_open时,出现“权限被拒绝”错误(通过errno)。有没有可能以任何方式做到这一点?或者有什么方法可以在一个进程中打开信号量并使用共享内存机制将其共享给子进程? 最佳答案 在标志中使用O_CREAT时不要忘记指定模式和值参数。这是一个工作示例:#inclu

c - 如何在 C 中多次调用 sem_open?

我在使用C语言使信号量在基于Linux的系统上工作时遇到了很多困难。我的申请流程是这样的:申请开始申请分支到child/parent每个进程使用具有共同名称的sem_open打开信号量。如果我在fork之前创建信号量,它工作正常。但是,要求阻止我这样做。当我第二次尝试调用sem_open时,出现“权限被拒绝”错误(通过errno)。有没有可能以任何方式做到这一点?或者有什么方法可以在一个进程中打开信号量并使用共享内存机制将其共享给子进程? 最佳答案 在标志中使用O_CREAT时不要忘记指定模式和值参数。这是一个工作示例:#inclu

linux - 如何显示当前持有信号量的进程?

在用户空间Linux中,我有一个进程阻塞在信号量上,正如strace所发现的那样。一旦错误条件发生,阻塞是可重复的,因此必须有另一个进程持有信号量并且没有释放它。有没有办法知道当前持有信号量的是哪个其他进程?ipcs列出信号量,/proc/sysvipc/sem也是如此。我在哪里可以找到有关持有过程的信息? 最佳答案 信号量不是互斥体。你不“持有”他们。如果该进程被阻塞,则意味着它正在等待其他人将来对其执行“up”或“V”操作。没有内核工具可以告诉您软件的future行为。 关于linu

linux - 如何显示当前持有信号量的进程?

在用户空间Linux中,我有一个进程阻塞在信号量上,正如strace所发现的那样。一旦错误条件发生,阻塞是可重复的,因此必须有另一个进程持有信号量并且没有释放它。有没有办法知道当前持有信号量的是哪个其他进程?ipcs列出信号量,/proc/sysvipc/sem也是如此。我在哪里可以找到有关持有过程的信息? 最佳答案 信号量不是互斥体。你不“持有”他们。如果该进程被阻塞,则意味着它正在等待其他人将来对其执行“up”或“V”操作。没有内核工具可以告诉您软件的future行为。 关于linu