int main(int argc, char **argv) { int c, id, oflag; char *ptr; size_t length; oflag = SVSHM_MODE | IPC_CREAT; while ( (c = Getopt(argc, argv, "e")) != -1) { switch (c) { case 'e': oflag |= IPC_EXCL; break; } } if (optind != argc - 2) err_quit("usage: shmget [ -e ] <pathname> <length>"); length = atoi(argv[optind + 1]); id = Shmget(Ftok(argv[optind], 0), length, oflag); ptr = Shmat(id, NULL, 0); printf("shm addr : %p\n", ptr); exit(0); }
int SMP_create(size_t size) { int semflg = 0600; DDI_Comm *comm = (DDI_Comm *) Comm_find(DDI_COMM_WORLD); /* hardcoded atm */ SMP_Data *new_data = (SMP_Data *) Malloc(sizeof(SMP_Data)); SMP_Data *end_data = (SMP_Data *) SMP_find_end(); STD_DEBUG((stdout,"%s: Entered DDI_SMP_Create.\n",DDI_Id())) if(end_data) end_data->next = (void *) new_data; else gv(smp_base_data) = (SMP_Data *) new_data; # if defined USE_SYSV Comm_sync_smp(comm); if(comm->me_local == 0) { new_data->handle = gv(smp_data_id)++; new_data->shmid = gv(shmid) = Shmget(IPC_PRIVATE,size,SHM_R|SHM_W); new_data->semid = Semget(IPC_PRIVATE,1,semflg); new_data->size = size; new_data->next = NULL; } Comm_bcast_smp(new_data,sizeof(SMP_Data),0,comm); new_data->addr = Shmat(new_data->shmid,0,0); MAX_DEBUG((stdout,"%s: SMP memory [%i] shmid=%i, semid=%i, addr=%x.\n", DDI_Id(),new_data->handle,new_data->shmid,new_data->semid,new_data->addr)) Comm_sync_smp(comm); if(comm->me_local == 0) { Shmctl(new_data->shmid,IPC_RMID,NULL); gv(shmid) = 0; } Comm_sync_smp(comm); # else new_data->handle = gv(smp_data_id)++; new_data->size = size; new_data->next = NULL; new_data->addr = Malloc(size); /* MWS: May 2010 It appears above that systems without SysV memory are expected to allocate Process-replicated memory instead of Node-replicated, and get on with it. If these are duplicated, at full size, as it appears, that's likely devastating for the system total memory usage. The parallel CCSD(T) on IBM Blue Gene/P got into a deadlock, but other systems with sockets or MPI seem to work if allowed to proceed. At this time, we kill off just the BG here... */ # ifdef IBMBG fprintf(stdout,"DDI compiled w/o SysV operating system support.\n"); fprintf(stdout,"IBM/BG parallel CCSD(T) cannot run w/o SysV.\n"); Fatal_error(911); # endif # endif return new_data->handle; }
int main(int argc, char **argv) { int i, id; struct shmid_ds buff; unsigned char *ptr; if (argc != 2) err_quit("Usage: write <pathname>"); id = Shmget(Ftok(argv[1], 0), 0, SVSHM_MODE); ptr = Shmat(id, NULL, 0); Shmctl(id, IPC_STAT, &buff); for (i = 0; i < buff.shm_segsz; i++) *ptr++ = i % 256; exit(0); }