|
源代码网推荐
1.想要从外部程序读取apache的共享内存,首先要了解apache使用的共享内存机制,以下是在一段测试apache使用的共享内存机制的小程序:
#include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include "httpd.h" #include "http_config.h" #include </usr/include/httpd/scoreboard.h>
int main(void) { if(APR_USE_SHMEM_SHMGET_ANON==1) { printf("use APR_USE_SHMEM_SHMGET_ANON!
"); } if(APR_USE_SHMEM_MMAP_TMP==1) { printf("use APR_USE_SHMEM_MMAP_TMP!
"); } if(APR_USE_SHMEM_MMAP_SHM==1) { printf("use APR_USE_SHMEM_MMAP_SHM!
"); } if(APR_USE_SHMEM_MMAP_ZERO==1) { printf("use APR_USE_SHMEM_MMAP_ZERO!
"); } if(APR_USE_SHMEM_SHMGET==1) { printf("use APR_USE_SHMEM_SHMGET!
"); } if(APR_USE_SHMEM_MMAP_ANON==1) { printf("use APR_USE_SHMEM_MMAP_ANON!
"); } exit(0); }
我的系统使用的是APR_USE_SHMEM_MMAP_ANON和APR_USE_SHMEM_SHMGET。其中APR_USE_SHMEM_SHMGET是命名共享内存机制,即当配置文件中有ScoreboardFile配置时使用的。而APR_USE_SHMEM_MMAP_ANON顾名思义是匿名共享内存机制。
知道了使用的共享机制类型后再阅读apr_shm_create代码,知道共享内存的数据结构及存放顺序后,就可以读取apache的共享内存了。下面要介绍的是使用命名共享内存时的读取方法。
2.如果你使用的命名共享内存机制是APR_USE_SHMEM_SHMGET,那么敲入ipcs后你可以得到apache的shmid.通过shmat它就可以读取apache的共享内存了。以下是实现程序:
#include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include "httpd.h" #include "http_config.h" #include </usr/include/httpd/scoreboard.h>
int main() { char* m; int i; int j; int myuid; struct shmid_ds shm_buf; global_score global; process_score* parent; myuid=getuid( ); printf("myuid=%d
",myuid);
shmctl(196609,IPC_STAT,&shm_buf); printf("shmperm.uid=%d
",shm_buf.shm_perm.uid); printf("shmperm.gid=%d
",shm_buf.shm_perm.gid); printf("size=%d
",shm_buf.shm_segsz);
if(shm_buf.shm_perm.uid==myuid) { printf("permission ok!
"); } m=shmat(196609,NULL,0); if(m==-1) { perror("shmat error"); exit(1); }
printf("sizeof(global_score)=%d
",sizeof(global_score)); printf("sizeof(process_score)=%d
",sizeof(process_score)); printf("sizeof(worker_score)=%d
",sizeof(worker_score)); printf("sizeof(scoreboard)=%d
",sizeof(scoreboard)); printf("sizeof(apr_size_t)=%d
",sizeof(apr_size_t)); printf("sizeof(int)=%d
",sizeof(int)); printf("sizeof(unsigned char)=%d
",sizeof(unsigned char));
global=*(global_score*)m; printf("server_limit=%d
",global.server_limit); printf("thread_limit=%d
",global.thread_limit);
m+=sizeof(global_score); parent=(process_score*)m; m+=sizeof(process_score)*global.server_limit;
worker_score worker[global.server_limit][global.thread_limit]; for(i=0;i<global.server_limit;i++) { worker[i][0]=*(worker_score*)m; m+=sizeof(worker_score); }
for(i=0;i<global.server_limit;i++) { if(worker[i][0].status!=SERVER_DEAD) printf("parent[%d].pid=%d
",i,parent[i].pid); } shmctl(196609,IPC_RMID,0); exit(0);
}
第一次发文请各位高手多多指教!!!
源代码网供稿. |