【问题标题】:Get data from shared memory after getting signal from child process从子进程获取信号后从共享内存中获取数据
【发布时间】:2015-01-06 18:23:21
【问题描述】:
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] 读取数据? 我想通知父级,数据已经写入共享内存,父级可以读取。

【问题讨论】:

  • 当父母的信号处理程序返回时,父母可以简单地读取数据。这可能意味着使用“等待信号”调用之一(pause()sigwait() 等),或者父母可能还有其他工作要做。在某些时候,它需要检查信号处理程序中设置的标志,以指示有数据准备好。
  • 我的建议:放松所有的信号处理。使用互斥体,在共享内存中有两个数据项,一个说数据可用,由子设置并由父读取。第二个包含实际数据'mem [0]'/父级在启动子级之前清除内存位置。孩子准备好后,锁定互斥锁,设置数据,设置“可用”标志,解锁互斥锁。父级锁定互斥体,检查标志,如果标志设置,读取数据endif,解锁互斥体

标签: c signals fork shared-memory


【解决方案1】:

在您的父级中,您可以在信号处理程序中读取共享数据。但是,根据您要如何处理这些数据,您可能需要采用不同的策略。例如:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多