LINUX.ORG.RU

[C] Работа с /proc


0

1

Есть демон (написанный на С), который должен считывать данные из файла /proc/abc. Сейчас считывание производится с помощью

system( "cat /proc/abc > /tmp/result" );

Однако если демону приходит SIGTERM, процесс, порожденный system, становиться осиротевшим и блокирует доступ к /proc/abc. Соответственно, надо либо читать по-другому (как?), либо добавить в обработчик сигнала функцию, которая бы отсылала SIGTERM потомкам (как?). Подскажите выход из ситуации.

>надо либо читать по-другому (как?)

man 3 open
man 3 read

anon_666 ()
Ответ на: комментарий от harvos

Исходники не нужны:

$ strace cat /proc/meminfo > meminfo
execve("/bin/cat", ["cat", "/proc/meminfo"], [/* 43 vars */]) = 0
brk(0)                                  = 0x9790000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7702000
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=104448, ...}) = 0
mmap2(NULL, 104448, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb76e8000
close(3)                                = 0
open("/lib/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\0\20m\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1323292, ...}) = 0
mmap2(NULL, 1333544, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb75a2000
mmap2(0xb76e2000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x13f) = 0xb76e2000
mmap2(0xb76e5000, 10536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb76e5000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb75a1000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb75a16c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb76e2000, 8192, PROT_READ)   = 0
mprotect(0x8051000, 4096, PROT_READ)    = 0
mprotect(0xb7720000, 4096, PROT_READ)   = 0
munmap(0xb76e8000, 104448)              = 0
brk(0)                                  = 0x9790000
brk(0x97b1000)                          = 0x97b1000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=3433008, ...}) = 0
mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb73a1000
close(3)                                = 0
fstat64(1, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
open("/proc/meminfo", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "MemTotal:        2061140 kB\nMemF"..., 32768) = 1220
write(1, "MemTotal:        2061140 kB\nMemF"..., 1220) = 1220
read(3, "", 32768)                      = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)    

edigaryev ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.