我想编写一些具有以下要求的 C 代码:
- 重复分叉执行。
- 分叉的进程应该使用大量内存,然后要么放弃它,要么干脆死掉,或者我干脆杀了它。
有任何想法吗?
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;
}