1

我已经编写了下面的代码,我想要以下内容:

在每 5 秒内,父级获取一个随机整数并放入共享内存中,然后向其子级发送一个信号。

孩子计算需要多少辆电车来承载该数量的乘客(如您所见,有 TRAM_CAP 等的定义),然后孩子将新的电车计数放入共享内存中。

最后,在收到信号通知后,父母会打印乘客和电车的数量。

我的问题是没有信号发送,但我不知道为什么。

我搜索并搜索了数百万次,但什么也没有......计时器正在工作,但没有别的(只是第一个“电车数量计算”)

顺便说一句,这是我一生中编写的第二个 C 代码:S 所以我是新手。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "fcntl.h"
#include "errno.h"

#include "sys/types.h"
#include "sys/stat.h"
#include "unistd.h"
#include <sys/time.h>
#include <signal.h>

#include <sys/ipc.h>
#include <sys/shm.h>

#include <math.h>

#define MEM_KEY 2003
#define INTERVAL 2

#define NEW_STAT SIGUSR1
#define NEW_TRAM_CNT SIGUSR2


#define MAX_PASSENGER 1000

#define TRAM_CAP 60

// "slots" in shared memory
#define PASS_CNT 0
#define TRAM_CNT 1

int get_pass_stat();
void handle_pass_stat_generation (int sig);
void handle_exit_func (int sig);
void set_pass_stat_generation();
void handle_new_tram_cnt_set(int sig);

void handle_new_stat_arrived(int sig);

void set_data(int which, int to);
int get_data(int which);

static pid_t ppid;
static pid_t chpid;

int main() 
{
  int shmid = shmget((key_t) MEM_KEY, sizeof(int) * 2, IPC_CREAT | 0666);
  int* segptr = shmat(shmid, 0, 0);
  segptr[PASS_CNT] = 0;     
  segptr[TRAM_CNT] = 0;
  // seed for rand
  srand((unsigned)time(NULL));
  //
  int pid=fork();
  if(pid == 0) // child
  {
    signal(NEW_STAT, handle_new_stat_arrived);
    while(1) sleep(30);

  }else if(pid > 0) // parent
  { 
    chpid = pid;
    ppid = getpid();

    signal(NEW_TRAM_CNT, handle_new_tram_cnt_set);
    signal(SIGINT,handle_exit_func);      
    set_pass_stat_generation(pid);

    while(1) sleep(30);
  }else
  {
    perror("Fork error."); 
    exit(1);      
  };
  return 0;

}

int get_pass_stat()
{
    return rand() % MAX_PASSENGER + 1;  
}

void handle_pass_stat_generation (int sig)
{
  int st = get_pass_stat();
  set_data(PASS_CNT, st);
  kill( chpid, NEW_STAT );
  printf("%i is the pass. cnt %i is the tram cnt. \n", st, get_data(TRAM_CNT));
 // set_pass_stat_generation();
}

void handle_exit_func (int sig)
{
    printf("\nBye Bye!!!\n");
    exit(0);
}

void set_pass_stat_generation()
{
  struct itimerval tval;
  tval.it_interval.tv_sec = INTERVAL;
  tval.it_interval.tv_usec = 0;
  tval.it_value.tv_sec = INTERVAL; /* 5 seconds timer */
  tval.it_value.tv_usec = 0;
  setitimer(ITIMER_REAL, &tval,0);

  signal(SIGALRM, handle_pass_stat_generation); /* set the Alarm signal capture */
}

void handle_new_stat_arrived(int sig)
{
  int tram_count = get_data(TRAM_CNT);
  int passenger_count = get_data(PASS_CNT);
  if( (TRAM_CAP * tram_count < passenger_count) || 
      (TRAM_CAP * (tram_count-1) > passenger_count) ||
      (passenger_count == 0) )
  {
      int new_cnt = (int) ceil((double)passenger_count / (double)TRAM_CAP);
      set_data(TRAM_CNT, new_cnt);
      kill( ppid, NEW_TRAM_CNT );
  } 
  signal(NEW_STAT, handle_new_stat_arrived);
}

void handle_new_tram_cnt_set(int sig)
{
    signal(NEW_TRAM_CNT,handle_new_tram_cnt_set);
}

void set_data(int which, int to)
{
  int shmid = shmget((key_t) MEM_KEY, 0, 0);
  int* segptr = shmat(shmid, 0, 0);
  segptr[which] = to;  
}

int get_data(int which)
{
  int shmid = shmget((key_t) MEM_KEY, 0, 0);
  int* segptr = shmat(shmid, 0, 0);
  return segptr[which]; 
}
4

0 回答 0