diff options
author | David Phillips <dbphillipsnz@gmail.com> | 2015-06-19 23:42:15 +1200 |
---|---|---|
committer | Markus Teich <markus.teich@stusta.mhn.de> | 2015-07-06 11:15:07 +0200 |
commit | 0edbd2e0164a8c6cbad415e38083469041f29996 (patch) | |
tree | 3f208ad6cbf0f43cba4b50d8d632d5f95624dc76 | |
parent | 754195f8d75586e23d1cc69cad00710802e0cb5d (diff) |
Slightly safer OOM killer disablement in linux
-rw-r--r-- | slock.c | 13 |
1 files changed, 12 insertions, 1 deletions
@@ -60,16 +60,27 @@ die(const char *errstr, ...) | |||
60 | 60 | ||
61 | #ifdef __linux__ | 61 | #ifdef __linux__ |
62 | #include <fcntl.h> | 62 | #include <fcntl.h> |
63 | #include <linux/oom.h> | ||
63 | 64 | ||
64 | static void | 65 | static void |
65 | dontkillme(void) | 66 | dontkillme(void) |
66 | { | 67 | { |
67 | int fd; | 68 | int fd; |
69 | int length; | ||
70 | char value[64]; | ||
68 | 71 | ||
69 | fd = open("/proc/self/oom_score_adj", O_WRONLY); | 72 | fd = open("/proc/self/oom_score_adj", O_WRONLY); |
70 | if (fd < 0 && errno == ENOENT) | 73 | if (fd < 0 && errno == ENOENT) |
71 | return; | 74 | return; |
72 | if (fd < 0 || write(fd, "-1000\n", 6) != 6 || close(fd) != 0) | 75 | |
76 | /* convert OOM_SCORE_ADJ_MIN to string for writing */ | ||
77 | length = snprintf(value, sizeof(value), "%d\n", OOM_SCORE_ADJ_MIN); | ||
78 | |||
79 | /* bail on truncation */ | ||
80 | if (length >= sizeof(value)) | ||
81 | die("buffer too small\n"); | ||
82 | |||
83 | if (fd < 0 || write(fd, value, length) != length || close(fd) != 0) | ||
73 | die("cannot disable the out-of-memory killer for this process\n"); | 84 | die("cannot disable the out-of-memory killer for this process\n"); |
74 | } | 85 | } |
75 | #endif | 86 | #endif |