C中的信号量和fork()

时间:2015-12-14 15:19:13

标签: c fork semaphore

我有以下代码块:

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "display.h"

int main()
{
  int i;

  if (fork())
  {
    for (i=0;i<10;i++)
      display("ab");
    wait(NULL);
  }
  else
  {
    for (i=0;i<10;i++)
      display("cd\n");
  }

  return 0;
}

display.c是:

/* DO NOT EDIT THIS FILE!!!  */

#include <stdio.h>
#include <unistd.h>
#include "display.h"

void display(char *str)
{
  char *p;
  for (p=str; *p; p++)
  {
    write(1, p, 1);
    usleep(100);
  }
}

和display.h是:

/* DO NOT EDIT THIS FILE!!!  */

#ifndef __CEID_OS_DISPLAY_H__
#define __CEID_OS_DISPLAY_H__
void display(char *);
#endif

如果我运行此代码,则输出为:

abacdb
abcdab
acdbababa
cbadb
cad
bcd
cd
cd
cd
cd

我想使用信号量来获得这样的输出:

abcd
abcd
abcd
....

我尝试这样做的原因如下:

#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/wait.h>
#include "display.h"
#include <semaphore.h>
#include <stdio.h>

int main()
{


    int i, my_sem, v1,v2,t;

    my_sem = semget(IPC_PRIVATE, 1, 0600);   /* CREATE OF THE SEMAPHORES */

    struct sembuf up = {0, 1, 0};       
    struct sembuf down = {0, -1, 0};    

    if (fork())
        {

            for (i=0;i<10;i++){

                display("ab");
            semop(my_sem, &up, 1);      /* UP (); */

            wait(NULL);

            }

        }
        else
        {
            for (i=0;i<10;i++){
            semop(my_sem, &down, 1);    /* DOWN (); */

                display("cd\n");

            semop(my_sem, &up, 1);  /* UP (); */
            }


        }

    return 0;
}

我的代码输出是:

abcd
cd
cd
cd
cd
cd
cd
cd
cd
cd
ababababababababab

它似乎只是第一次有效。我是sempaphores的新手,所以我需要一些帮助,以使我的代码工作。

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

wait(null)等待子进程终止,在这种情况下,您等待孩子完全完成,然后再恢复您的&#34; ab&#34;循环,因此为什么&#34; ab&#34;显示一次后跟所有&#34; cd&#34;线。

您需要进一步思考如何在流程之间进行通信。您可以使用您的信号量(它们的值)来防止一个进程在取得进展的同时取得进展。