以下の方法でメモリが読み書き可能かどうかを調べられることを知りました。要は loopback な pipe を作ってそのメモリの内容を write してみて書き出せたら readable で、その後同じ内容をそのメモリに read してみて読み出せたら writable 。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
void error_exit() {
perror("pipe");
exit(EXIT_FAILURE);
}
int check_readable(int* lb, void* p) {
char b;
return write(lb[1], p, 1) >= 0 && read(lb[0], &b, 1) >= 0;
}
int check_writable(int* lb, void* p) {
return write(lb[1], p, 1) >= 0 && read(lb[0], p, 1) >= 0;
}
void check_access(const char* msg, int* lb, void* p) {
printf("%s:\t", msg);
puts(printf("%s%s",
check_readable(lb, p) ? "readable " : "",
check_writable(lb, p) ? "writable" : "")
? "" : "nothing");
}
int main() {
int loopback[2];
if (pipe(loopback)) {
error_exit();
}
check_access("stack", loopback, loopback);
check_access("heap", loopback, malloc(1));
check_access("code", loopback, &main);
check_access("null", loopback, NULL);
close(loopback[0]);
close(loopback[1]);
return 0;
}実行結果は以下のようになりました。
stack: readable writable heap: readable writable code: readable null: nothing