服务器技术

 首页 > 服务器技术 > apache > 读取apache的共享内存|printf-Apache教程

读取apache的共享内存|printf-Apache教程

分享到:
【字体:
导读:
          ...

1.想要从外部程序读取apache的共享内存,首先要了解apache使用的共享内存机制,以下是在一段测试apache使用的共享内存机制的小程序:

#include
#include
#include
#include "httpd.h"
#include "http_config.h"
#include

int main(void)
{
 if(APR_USE_SHMEM_SHMGET_ANON==1)
 {
  printf("use APR_USE_SHMEM_SHMGET_ANON!n");
}
if(APR_USE_SHMEM_MMAP_TMP==1)
 {
  printf("use APR_USE_SHMEM_MMAP_TMP!n");
}
if(APR_USE_SHMEM_MMAP_SHM==1)
 {
  printf("use APR_USE_SHMEM_MMAP_SHM!n");
}
if(APR_USE_SHMEM_MMAP_ZERO==1)
 {
  printf("use APR_USE_SHMEM_MMAP_ZERO!n");
}
if(APR_USE_SHMEM_SHMGET==1)
 {
  printf("use APR_USE_SHMEM_SHMGET!n");
}
if(APR_USE_SHMEM_MMAP_ANON==1)
 {
  printf("use APR_USE_SHMEM_MMAP_ANON!n");
}
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
#include
#include
#include "httpd.h"
#include "http_config.h"
#include

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=%dn",myuid);

 shmctl(196609,IPC_STAT,&shm_buf);
 
 printf("shmperm.uid=%dn",shm_buf.shm_perm.uid);
 printf("shmperm.gid=%dn",shm_buf.shm_perm.gid);
 printf("size=%dn",shm_buf.shm_segsz);

if(shm_buf.shm_perm.uid==myuid)
{
 printf("permission ok!n");
}
m=shmat(196609,NULL,0);
 if(m==-1)
{
perror("shmat error");
exit(1);
}

printf("sizeof(global_score)=%dn",sizeof(global_score));
printf("sizeof(process_score)=%dn",sizeof(process_score));
printf("sizeof(worker_score)=%dn",sizeof(worker_score));
printf("sizeof(scoreboard)=%dn",sizeof(scoreboard));
printf("sizeof(apr_size_t)=%dn",sizeof(apr_size_t));
printf("sizeof(int)=%dn",sizeof(int));
printf("sizeof(unsigned char)=%dn",sizeof(unsigned char));


global=*(global_score*)m;
printf("server_limit=%dn",global.server_limit);
printf("thread_limit=%dn",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 {
  worker[i][0]=*(worker_score*)m;
  m+=sizeof(worker_score);
 
}

for(i=0;i {
 if(worker[i][0].status!=SERVER_DEAD)
 printf("parent[%d].pid=%dn",i,parent[i].pid);
}
shmctl(196609,IPC_RMID,0);
exit(0);


"读取apache的共享内存"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Server/Apache/18024.html
分享到:
Apache日志:访问日志|日志-Apache教程
想要知道什么人在什么时候浏览了网站的哪些内容吗?查看apache的访问日志就可以知道。访问日志是Apache的标准日志,本文详细解释了访问日志的内容以及相关选项的配置。      一、访问日志的格式         Apache内建了记录服务器活动的功能,这就是它的日志功能。这个《Apache日志》系列文章介绍的就是Apache的访...
怎样在Apache上安装MOD_SSL|openssl-Apac...
手工签署证书的方法 虽然在安装MOD_SSL时已经使用 make certificate 命令建立了服务器 的证书签名,但是有时你可能需要改变它。 当然有很多自动的脚本可以实现它,但是最可靠的方法是手工签署 证书。 首先我假定你已经安装好了openssl和MOD_SSL,如果你的openssl安装时 的prefix设置为/usr/local/openssl,那么把/usr/local...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……