父子进程对相同存贮区域访问

来源:互联网 发布:企业网站建设优化 编辑:程序博客网 时间:2024/06/08 17:35
#include <fcntl.h>#include <stdio.h>#include "apue.h"#include <errno.h>#include <sys/wait.h>#include "sys/types.h"#include <unistd.h>#include <stropts.h>#include <sys/mman.h>#include <sys/shm.h>#define NLOOPS 1000#define SIZE sizeof(long)static volatile sig_atomic_t sigflag;static sigset_t newmask,oldmask,zeromask;static voidsig_usr(int signo){sigflag=1;}void  TELL_WAIT(void){if(signal(SIGUSR1,sig_usr)<0)err_sys("SIGUSR1 erro");if(signal(SIGUSR2,sig_usr)<0)err_sys("SIGUSR2 erro");sigemptyset(&newmask);sigemptyset(&zeromask);sigaddset(&newmask,SIGUSR1);sigaddset(&newmask,SIGUSR2);//block signal usr1 usr2 and save current  mask in oldmask;if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0)err_sys("SIG_BLOCK err");}void TELL_PARENT(pid_t pid){kill(pid,SIGUSR2);}voidWAIT_PARENT(void){while(sigflag==0)sigsuspend(&zeromask);sigflag=0;if(sigprocmask(SIG_BLOCK,&newmask,NULL)<0)err_sys("wait SIG_BLOCK err");}void TELL_CHILD(pid_t pid){kill(pid,SIGUSR1);}void WAIT_CHILD(void){while(sigflag==0)sigsuspend(&zeromask);sigflag=0;if(sigprocmask(SIG_BLOCK,&oldmask,NULL)<0)err_sys("wait chiled SIG_BLOCK err");}static int update(long* ptr){return((*ptr)++);}int main(int argc , char *argv[]){int fd,i,counter;pid_t pid;void *area;if((fd=open("/dev/zero",O_RDWR))<0)err_sys("open /dev/zero erro");if((area=mmap(0,1000,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0))==MAP_FAILED)err_sys("mmap erro");close(fd);TELL_WAIT();if((pid=fork())<0)err_sys("fork erro");else if(pid>0){printf("SIZE=%4d ",sizeof(long));for(i=0;i<NLOOPS;i+=2){if((counter=update((long *)area))!=1)err_quit("parent:expected %d ,got %d",i,counter);TELL_CHILD(pid);WAIT_CHILD();}}else{   for(i=1;i<NLOOPS+1;i+=2)   {   WAIT_PARENT();if((counter=update((long *)area))!=1)err_quit("child:expected %d ,got %d",i, counter);TELL_PARENT(getppid());   }}exit(0);}

原创粉丝点击