测试程序1:模拟触发OOM程序
/************************************************************************* > File Name: hello.c > Created Time: Fri 23 Oct 2020 09:40:35 AM CST ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #define __USE_LARGEFILE64 #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <pthread.h> // 修改如下开关分别编译两个测试程序在测试平台同时运行 #if 1 #define MB (1024 * 1024) int main() { const size_t size = 205*MB; char *buf = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (buf == MAP_FAILED) { perror("mmap"); exit(1); } size_t written = 0; while (1) { size_t remaining = size - written; if (remaining == 0) { written = 0; } size_t chunk = remaining < MB ? remaining : MB; memset(buf + written, 'a', chunk); written += chunk; } } #else int main(void) { int ret; void *status; void *ptr = NULL; int fd = 0; printf("==== oom test ====\r\n"); unsigned int cnt = 0; while(1) { //printf("open cnt=%d", cnt); ptr = malloc(1*1024); cnt++; *(char*)ptr = 'a'; // 使用分配的内存 usleep(10000); } return 0; } #endif
测试程序2:fork子进程测试程序
/************************************************************************* > File Name: hello.c > Created Time: Fri 23 Oct 2020 09:40:35 AM CST ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #define __USE_LARGEFILE64 #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <pthread.h> #include <semaphore.h> #define FILE_SIZE (100*1024) pthread_t thread_id1; pthread_t thread_id2; int fd = 0; sem_t gt_sem; char buf_wr[FILE_SIZE] = {0}; char buf_rd[FILE_SIZE] = {0}; int main(void) { printf("+++process %d start running!ppid = %d\n",getpid(),getppid()); volatile int i = 0; pid_t pid = fork(); if(pid){//父进程 printf("%2d parent:process %d start running!ppid = %d\n",i++,getpid(),getppid()); printf("%2d parent:process %d finish running!ppid = %d\n",i++,getpid(),getppid()); while(1) { sleep(1); } } else{//子进程 printf("%2d child:process %d start running!ppid = %d\n",i++,getpid(),getppid()); printf("%2d child:process %d finsish running!ppid = %d\n",i++,getpid(),getppid()); } return 0; }