|
- #include "stdio.h"
- #include "sys/types.h"
- #include "errno.h"
- #include "sys/shm.h"
- #include "sys/ipc.h"
- #include "string.h"
- #include "sys/sem.h"
- #include "unistd.h"
- #define K 1024
- #define SHMSIZE K*4*16
- #define SHMFLAGS IPC_CREAT|0644
- struct mystruct{
- int user_name;
- struct mystruct * next;
- };
- typedef struct mystruct * MYSTRUCT;
- int shmid;
- cleanup(){
- shmctl(shmid,IPC_RMID,0);
- exit(0);
- }
- main(){
- char * addr1;
- int i;
- pid_t pid;
- MYSTRUCT user_struct;
- MYSTRUCT p,q,r;
- for(i=0;i<20;i++)
- signal(i,cleanup);
- shmid = shmget(IPC_PRIVATE,SHMSIZE,SHMFLAGS);
- if(shmid == -1){
- printf("shm create failed!\n");
- }else{
- printf("shared memory segment ID = %d\n",shmid);
- addr1 = shmat(shmid,0,0);
- if((pid=fork())==0){
- user_struct = (MYSTRUCT)addr1;
- r = user_struct;
- i=0;
- while(i<100){
- /* q=(MYSTRUCT)malloc(sizeof(struct mystruct));
- */
- q=user_struct++;
- q->user_name = i;
- q->next=NULL;
- r->next=q;
- r=r->next;
- i++;
-
- /* sleep(1); */
- /*
- 此处如果不加sleep(1),则一切正常,如果加上sleep(1),
- 那么仅仅打印链表的第一二个节点的地址,等很久以后,
- 可能会打印以后节点的地址,是不是由于进程不同步的问题?
- */
- }
- }
- if((pid=fork())==0){
- while(1){
- p= (MYSTRUCT)addr1;
- i=0;
- while(p!=NULL){
- printf("0x%x\n",p);
- p=p->next;
- i++;
- }
- sleep(2);
- }
- }
- shmdt(addr1);
- shmctl(shmid,IPC_RMID,0);
- }
- }
复制代码 |
|