2012-07-24 42 views
1

我想寫出具有下列要求的一些C代碼:計劃做叉EXEC在觸摸大內存區域

  1. - 反覆叉高管。
  2. fork'ed進程應該使用大量內存,然後放棄它或者死掉,否則我會殺死它。

任何想法?

+0

什麼?奇怪的作業?或者你有其他目的?你有什麼嘗試? – lvella 2012-07-24 16:53:17

+0

@Ivella這不是一項功課。還沒有嘗試過任何東西。我正要去。我會發布我的代碼。 – abc 2012-07-24 17:41:01

+0

你需要什麼目的?如果我們知道實際的問題,我們可能會提供更好的解決方案... – thkala 2012-07-24 17:53:10

回答

1
int main (int argc, char *argv[]) { 
    unsigned long long bytes; 
    char bytes_str[32]; 
    void *buf; 
    int i; 
    if (argc < 2) { 
     fprintf(stderr, "usage: %s [megabytes]\n", argv[0]); 
     exit(EXIT_SUCCESS); 
    } else if (argc < 3) { 
     switch (fork()) { 
     case 0: break; 
     case -1: perror("fork"); 
       exit(EXIT_FAILURE); 
     default: exit(EXIT_SUCCESS); 
     } 
     bytes = strtoull(argv[1], 0, 0) * 1024 * 1024; 
     snprintf(bytes_str, sizeof(bytes_str), "%llu", bytes); 
     if (execlp(argv[0], argv[0], "child", bytes_str, (char *)0) != 0) { 
      perror("execlp"); 
      exit(EXIT_FAILURE); 
     } 
     /* NOT REACHED */ 
    } else { 
     bytes = strtoull(argv[2], 0, 0); 
    } 
    if (bytes < 1024*1024) exit(EXIT_SUCCESS); 
    buf = malloc(bytes); 
    if (buf == 0) { 
     perror("malloc"); 
     exit(EXIT_FAILURE); 
    } 
    memset(buf, '\xff', bytes); 
    free(buf); 
    bytes /= 2; 
    snprintf(bytes_str, sizeof(bytes_str), "%llu", bytes); 
    for (i = 0; i < 2; ++i) { 
     switch (fork()) { 
     case 0: break; 
     case -1: perror("fork"); 
       exit(EXIT_FAILURE); 
     default: continue; 
     } 
     if (execlp(argv[0], argv[0], "child", bytes_str, (char *)0) != 0) { 
      perror("execlp"); 
      exit(EXIT_FAILURE); 
     } 
     /* NOT REACHED */ 
    } 
    return 0; 
}