gpt4 book ai didi

c - 使用信号量独立执行进程

转载 作者:太空宇宙 更新时间:2023-11-04 04:26:29 25 4
gpt4 key购买 nike

我已经使用信号量为一个 unix 项目创建了一个代码。我的代码是这样的:

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include "display.h"
#include <semaphore.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>

typedef struct {
sem_t p1;
sem_t p2;
}SemPair ;

int main ( int argc, char *argv[]) {
SemPair *sem = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED |MAP_ANONYMOUS , -1, 0);
int i=0;
sem_init(&(sem->p1),1,0);
sem_init(&(sem->p2),1,0);

pid_t pid = fork();
if (!pid)
{
for( i=0;i<10;i++) {
sem_wait(&(sem->p2));
display("Hello world\n");
sem_post(&(sem->p1)); }
}
else
{
for( i=0;i<10;i++) {

sem_post(&(sem->p2));
sem_wait(&(sem->p1));
display("Goodnight world\n");
sleep(1);}

}
sem_destroy(&(sem->p1));
sem_destroy(&(sem->p2));

return 0;

如您所见,我的问题是我不想一个一个地按顺序显示,而是随机显示。所以我的输出是这样的。

Hello world
Goodnight world
Hello world
Goodnight world
Hello world
Goodnight world
....

相反,我希望进程不按顺序执行,因此输出将是这样的:

  Hello world
Hello world
Hello world
Goodnight world
Hello world
Goodnight world
Goodnight world
....

最佳答案

这不会像您使用信号量那样发生。

导致输出困惑的整个问题(以及您一开始使用信号量的原因)是进程在其写入过程中被中断。

没有信号量,你有这个:

  1. 进程A开始打印“Hell”
  2. 进程A被中断;其他进程运行
  3. 进程B最终得到它的共享时间并开始打印“Good”
  4. 进程B被中断;其他进程运行
  5. 进程 A 完成写入“o world”

你当然知道这一点。您可以看到这如何导致输出被破坏。

重点是信号量如何改变这一点。当您到达第 3 点时,进程 B 将因其调用 sem_wait 而被阻塞(顺便说一句,您的“进程 B”未正确处理信号量)。当进程 A 将信号量增加回 1 时,sem_post 将立即解锁进程 B 并让它继续,然后进程 A 可以回到循环开始并运行 sem_wait再次。

关于c - 使用信号量独立执行进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40950115/

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