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 に書きっぱなしになります.不必要になったら消さないと.