Created
February 21, 2011 19:53
-
-
Save shoban/837605 to your computer and use it in GitHub Desktop.
Monitor for changes in mount points via /proc/mounts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <fcntl.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <sys/stat.h> | |
#include <sys/time.h> | |
#include <sys/types.h> | |
#include <unistd.h> | |
#define MOUNT_PROC "/proc/mounts" | |
int main(int argc, char **argv) | |
{ | |
int mfd = open(MOUNT_PROC, O_RDONLY, 0); | |
if (mfd < 0) { | |
fprintf(stderr, "ERROR: Unable to open %s.", MOUNT_PROC); | |
exit(EXIT_FAILURE); | |
} | |
fd_set rfds; | |
struct timeval tv; | |
int rv; | |
FD_ZERO(&rfds); | |
FD_SET(mfd, &rfds); | |
tv.tv_sec = 5; | |
tv.tv_usec = 0; | |
int changes = 0; | |
while ((rv = select(mfd+1, &rfds, NULL, NULL, &tv)) >= 0) { | |
if (FD_ISSET(mfd, &rfds)) { | |
fprintf(stdout, "Mount points changed. %d.\n", changes++); | |
} | |
FD_ZERO(&rfds); | |
FD_SET(mfd, &rfds); | |
tv.tv_sec = 5; | |
tv.tv_usec = 0; | |
if (changes > 10) { | |
exit(EXIT_FAILURE); | |
} | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
strace output on the failing machine:
strace ./mount-mon-simple >/dev/null
execve("./mount-mon-simple", ["./mount-mon-simple"], [/* 43 vars */]) = 0
brk(0) = 0x9fc5000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb775e000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=78022, ...}) = 0
mmap2(NULL, 78022, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb774a000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0000m\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1405508, ...}) = 0
mmap2(NULL, 1415592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x9c4000
mprotect(0xb17000, 4096, PROT_NONE) = 0
mmap2(0xb18000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x153) = 0xb18000
mmap2(0xb1b000, 10664, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb1b000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7749000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb77496c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb18000, 8192, PROT_READ) = 0
mprotect(0x8049000, 4096, PROT_READ) = 0
mprotect(0xeef000, 4096, PROT_READ) = 0
munmap(0xb774a000, 78022) = 0
open("/proc/mounts", O_RDONLY) = 3
select(4, [3], NULL, NULL, {5, 0}) = 1 (in [3], left {4, 999994})
fstat64(1, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfb723d4) = -1 ENOTTY (Inappropriate ioctl for device)
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb775d000
select(4, [3], NULL, NULL, {5, 0}) = 1 (in [3], left {4, 999994})
select(4, [3], NULL, NULL, {5, 0}) = 1 (in [3], left {4, 999995})
select(4, [3], NULL, NULL, {5, 0}) = 1 (in [3], left {4, 999995})
select(4, [3], NULL, NULL, {5, 0}) = 1 (in [3], left {4, 999995})
select(4, [3], NULL, NULL, {5, 0}) = 1 (in [3], left {4, 999995})
select(4, [3], NULL, NULL, {5, 0}) = 1 (in [3], left {4, 999995})
select(4, [3], NULL, NULL, {5, 0}) = 1 (in [3], left {4, 999995})
select(4, [3], NULL, NULL, {5, 0}) = 1 (in [3], left {4, 999995})
select(4, [3], NULL, NULL, {5, 0}) = 1 (in [3], left {4, 999995})
select(4, [3], NULL, NULL, {5, 0}) = 1 (in [3], left {4, 999995})
write(1, "Mount points changed. 0.\nMount p"..., 276) = 276
exit_group(1) = ?