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]中读取数据?
我想通知父母该数据已被写入共享内存,并且父母可以读取它。
最佳答案
在您的父母中,您可以在信号处理程序中读取共享数据。但是,根据您要处理这些数据的不同,您可能希望采用其他策略。例如:
在信号处理程序中增加全局静态变量(将其设为volatile sig_atomic_t
)。然后在它们的程序主循环中对此进行测试,并采取适当的措施。
更好,请使用自管。说明here。本质上,创建一个非阻塞pipe()
并从信号处理程序中向其写入一个字符。在主循环中以正常方式在管道的读取侧上select()
。
如果您的父进程是多线程的,请考虑放弃信号处理程序,并使用信号量或类似方法。
关于c - 从子进程获取信号后,从共享内存中获取数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27804748/