使用此程式可以粗略的測試linux系統下pv操作的效能。(System V 號誌)
如下:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/ipc.h>#include <sys/sem.h>#include <asm/errno.h>#include <errno.h>#definekey_tdoubleunion semun{intval;structsemid_ds *buf;ushort*array;}para;int SemP(int id, int off,int flag);int SemV(int id, int off);int main(int argc,char **argv){intsemid,oflags,nsems;intop_flag,id;charpath[256]="";key_tkeyvalue;inti,ret;intsemsem,looptime;if(argc != 6){printf("useage: ./semop pathname nsems op_flag semsem looptime\n");exit(0);}strcpy(path,argv[1]);nsems = atoi(argv[2]);op_flag = atoi(argv[3]);semsem = atoi(argv[4]);looptime = atoi(argv[5]);printf("You Input Args is:\n");printf("path:%s\t nsems:%d\t op_flag:%d\t semsem:%d\t looptime:%d\n",path,nsems,op_flag,semsem,looptime);oflags = 0666 | IPC_CREAT | IPC_EXCL;keyvalue = ftok(path, 'S');if(op_flag == 0){/* Create Sem */if((semid = semget(keyvalue,nsems,oflags))<0){fprintf(stderr,"semget create failed!errno is %d\n",errno);exit(0);}/* Init Sem Values */for(i=0;i<nsems;i++){para.val = 1;if((ret = semctl(semid,i,SETVAL,para))<0)printf("sem %d set value failed!\n",i);}printf("semop create ok!\nsemid is %d\n",semid);}/* PV opration */if(op_flag == 1){if((semid = semget(keyvalue,0,0666)) < 0){printf("semget read failed!errno is %d\n",errno);exit(-1);}for(i=0;i<looptime;i++){if(SemP(semid,semsem,1) < 0){printf("SemP failed!i=%d\n",i);exit(-1);}if(SemV(semid,semsem) < 0){printf("SemV failed!i=%d\n",i);exit(-1);}}}/* Del Sem */if(op_flag == 2){if((semid = semget(keyvalue,0,0666)) < 0){printf("semget read failed!errno is %d\n",errno);exit(-1);}if((semctl(semid,0,IPC_RMID,0))<0){printf("semop delete failed!semid is %d\n",semid);}elseprintf("semop delete ok!\nsemid is %d\n",semid);}return 0;}int SemP(int id, int off, int flag){intrtn,errno;struct sembufp_buf;p_buf.sem_num = off;p_buf.sem_op = -1;if (flag)p_buf.sem_flg = SEM_UNDO;while(1){rtn=semop(id, &p_buf, 1);if( rtn < 0 ){if( errno == EINTR ) continue;else return -1;}break;}return0;}int SemV(int id, int off){intrtn,errno;struct sembufp_buf;p_buf.sem_num = off;p_buf.sem_op = 1;p_buf.sem_flg = SEM_UNDO;while(1){rtn=semop(id, &p_buf, 1);if( rtn < 0 ){if( errno == EINTR ) continue;else return -1;}break;}return0;}
參數說明:
op_flag:0代表建立號誌,1代表進行PV操作,2代表刪除號誌。
執行過程:
首先建立號誌,其次進行PV操作測試,注意可以在命令執行的前面加上 time 指令,方便時間統計。使用完畢之後刪除號誌即可。
執行指令碼:
#bin/shtime ./semop /tmp 1 1 0 2000000 &time ./semop /tmp 1 1 1 2000000 &time ./semop /tmp 1 1 2 2000000 &time ./semop /tmp 1 1 3 2000000 &exit