从子进程获取信号后从共享内存中获取数据

时间:2015-01-06 18:23:21

标签: c signals fork shared-memory

int *sharedmem(key_t *key,char k,int size){
  int shmid;
  int *segptr;
  *key=ftok('.',k);
  if((shmid=shmget(*key,size,IPC_CREAT|IPC_EXCL|0666))==-1){
    printf("Shared memory segment exists - opening as client\n");
    if((shmid = shmget(*key, size, 0)) == -1){
      perror("bad shmget");
      exit(1);
    }
  }
  else
    printf("Creating new shared memory segment\n");
  if((segptr = shmat(shmid, 0, 0)) == NULL){
    perror("bad shmat");
    exit(1);
  }
  return segptr;
}
int main(){
  ...
  mem=sharedmem(&key,'a',2);
  fpid=getpid();
  signal(SIGHUP,sighup);
  if(pid=fork()==0){
    ...
    mem[0]=1;
    kill(fpid,SIGHUP);
  }
  else {//parent
     //read data from mem[0] when receiving the signal.
  }

如何在收到来自子进程的信号时从父级的mem [0]中读取数据? 我想通知父母数据已写入共享内存,父母可以读取它。

1 个答案:

答案 0 :(得分:0)

在您的父级中,您只需读取信号处理程序中的共享数据即可。但是,根据您对此数据的处理方式,您可能希望采用不同的策略。例如:

  • 在信号处理程序中增加一个全局静态变量(将其设为volatile sig_atomic_t)。然后在他们的程序主循环测试这个,并采取适当的行动。

  • 更好,使用自我管道。解释here。实质上创建一个非阻塞pipe()并从信号处理程序中为它写一个字符。在主循环中以正常方式读取管道的select()

  • 如果您的父进程是多线程的,请考虑放弃信号处理程序并使用信号量或类似信号。