


讀取apache的共享內存
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!\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 <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\n",myuid);
shmctl(196609,IPC_STAT,&shm_buf);
printf("shmperm.uid=%d\n",shm_buf.shm_perm.uid);
printf("shmperm.gid=%d\n",shm_buf.shm_perm.gid);
printf("size=%d\n",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)=%d\n",sizeof(global_score));
printf("sizeof(process_score)=%d\n",sizeof(process_score));
printf("sizeof(worker_score)=%d\n",sizeof(worker_score));
printf("sizeof(scoreboard)=%d\n",sizeof(scoreboard));
printf("sizeof(apr_size_t)=%d\n",sizeof(apr_size_t));
printf("sizeof(int)=%d\n",sizeof(int));
printf("sizeof(unsigned char)=%d\n",sizeof(unsigned char));
global=*(global_score*)m;
printf("server_limit=%d\n",global.server_limit);
printf("thread_limit=%d\n",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\n",i,parent[i].pid);
}
shmctl(196609,IPC_RMID,0);
exit(0);
}
關鍵字:讀取 apache 共享內存
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解