C 中的信号量和 fork()

Semaphores and fork() in C

我有以下代码块:

#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 的新手,所以我需要一些帮助才能使我的代码正常工作。

感谢您的宝贵时间。

wait(null) 等待子进程终止,在这种情况下,您正在等待子进程在恢复 "ab" 循环之前完全完成,因此显示 "ab" 的原因之后是所有 "cd" 行。

你需要进一步思考进程之间如何通信。您可以使用信号量(它们的值)来阻止一个进程取得进展,同时允许另一个进程取得进展。