LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 796|回复: 2

请教一个共享内存问题

[复制链接]
发表于 2004-3-23 22:12:47 | 显示全部楼层 |阅读模式

  1. #include "stdio.h"
  2. #include "sys/types.h"
  3. #include "errno.h"
  4. #include "sys/shm.h"
  5. #include "sys/ipc.h"
  6. #include "string.h"
  7. #include "sys/sem.h"
  8. #include "unistd.h"


  9. #define K    1024
  10. #define SHMSIZE K*4*16
  11. #define SHMFLAGS IPC_CREAT|0644

  12. struct mystruct{
  13.   int user_name;
  14.   struct mystruct * next;
  15. };

  16. typedef struct mystruct * MYSTRUCT;


  17. int shmid;
  18. cleanup(){
  19.    shmctl(shmid,IPC_RMID,0);
  20.    exit(0);
  21. }


  22. main(){
  23.   char * addr1;
  24.   int i;
  25.   pid_t pid;

  26.   MYSTRUCT user_struct;
  27.   MYSTRUCT p,q,r;


  28.   for(i=0;i<20;i++)
  29.    signal(i,cleanup);

  30.   shmid = shmget(IPC_PRIVATE,SHMSIZE,SHMFLAGS);

  31.   if(shmid == -1){
  32.    printf("shm create failed!\n");

  33.   }else{
  34.    printf("shared memory segment ID = %d\n",shmid);
  35.    addr1 = shmat(shmid,0,0);

  36. if((pid=fork())==0){
  37.         user_struct = (MYSTRUCT)addr1;
  38.         r = user_struct;
  39.         i=0;

  40.   while(i<100){
  41. /*      q=(MYSTRUCT)malloc(sizeof(struct mystruct));
  42. */
  43.       q=user_struct++;
  44.       q->user_name = i;
  45.       q->next=NULL;
  46.       r->next=q;
  47.       r=r->next;
  48.       i++;
  49.    
  50. /*      sleep(1);     */
  51. /*
  52. 此处如果不加sleep(1),则一切正常,如果加上sleep(1),
  53. 那么仅仅打印链表的第一二个节点的地址,等很久以后,
  54. 可能会打印以后节点的地址,是不是由于进程不同步的问题?
  55. */


  56.   }      
  57. }
  58.    if((pid=fork())==0){
  59.    while(1){   
  60.       p= (MYSTRUCT)addr1;
  61.            i=0;   
  62.       while(p!=NULL){
  63.          printf("0x%x\n",p);   
  64.          p=p->next;
  65.          i++;
  66.       }
  67.       sleep(2);
  68.    }
  69.    }
  70.    shmdt(addr1);

  71.    shmctl(shmid,IPC_RMID,0);
  72.   }   

  73. }
复制代码
发表于 2004-4-8 14:20:04 | 显示全部楼层
现在我想把双系统改成虚拟机,怎么能够使windowsxp与linux共享内存呢
谢谢
发表于 2004-4-8 15:16:46 | 显示全部楼层
fork()两次做什么,是不是写错了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表