Shared memory においた画像を xpa で ds9 に表示するためのプログラム
Shared memory においた画像を xpa で ds9 に表示するためのプログラムを書いた.
#include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/shm.h> #define FILESIZE 17072640 #define NCHIP 1 int putfits(char* fits, int* fsize) { FILE* fp; char *shared_data; char *shared_data_b; int shm_id, ch; *fsize=FILESIZE; /* read fits and allocate some memory region on shared memory */ if((fp=fopen(fits,"rb"))==NULL) { perror("Cannot open file"); exit(EXIT_FAILURE); } shm_id=shmget(IPC_PRIVATE,*fsize,0666|IPC_CREAT); if(shm_id == -1) { perror("shmget failure"); exit(EXIT_FAILURE); } shared_data=shmat(shm_id,0,0); shared_data_b=shared_data; if(shared_data==-1) { perror("shmat failure"); exit(EXIT_FAILURE); } /* try to write shared memory */ while((ch=fgetc(fp))!=EOF) *(shared_data++)=ch; printf("fp : %d %p\n", sizeof(fp), &fp); printf("shm : %d %p\n", sizeof(shared_data), &shared_data); printf("shm_id: %d\n", shm_id); if(shmdt(shared_data_b)==-1) { perror("shmdt failure"); } fclose(fp); return shm_id; } int main( int argc, char* argv[] ) { char cmd[80]; int fsize; int shm_id[NCHIP]; int i; if (argc != 2 ) { exit(EXIT_FAILURE); } for(i=0;i<NCHIP;i++){ shm_id[i]=putfits(argv[1],&fsize); } for(i=0;i<NCHIP;i++) { sprintf(cmd, "xpaset -p ds9 shm shmid %d %d", shm_id[i], fsize); printf("%s\n", cmd); system(cmd); } return 0; }
fits の読み込み速度とかが知りたいわけではなくて,Shared memory にある fits file を
xpaset -p ds9 shm shmid address size
で ds9 に書かせたときにどれくらい時間がかかるかを調べたかった.
結果的に
time xpaset -p ds9 shm shmid 5800033 17072640 0.000u 0.003s 0:00.56 0.0% 0+0k 0+0io 0pf+0w
というところで,2k x 4k画像が1秒弱で描画される.(Core2Duo 6600 @ 2.40GHz)
あんまり速くないなぁ・・・
ちなみにこのプログラムは shared memory に書きっぱなしになります.不必要になったら消さないと.