使用信号量独立执行进程

时间:2016-12-03 16:48:19

标签: c process semaphore shared

我已经使用信号量为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 个答案:

答案 0 :(得分:0)

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

获取输出的整个问题(以及你开始使用信号量的原因)是一个进程在编写过程中被中断。

没有信号量,你有这个:

  1. 进程A开始打印“地狱”
  2. 进程A被中断;其他流程运行
  3. 进程B最终获得其共享时间并开始打印“Good”
  4. 进程B中断;其他流程运行
  5. 流程A完成“o world”的写作
  6. 当然,你知道这一点。您可以看到这会导致输出被破坏。

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