Задача следующая - Приложение, обнаруживающее именованные каналы и локальные сокеты, не открытые ни одним процессом.
Теперь к тому что получилось)
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys import glob import re from stat import * def get_process_name_by_pid(pid, onlyName=False): cmdLineFile = open('/proc/' + str(pid) + '/cmdline', 'r') cmdLine = cmdLineFile.readline() cmdLineFile.close() if onlyName: return os.path.split(cmdLine.split('\x00')[0])[1] else: return ''.join([(char if char != '\x00' else ' ') for char in cmdLine]) def get_pipes_in_proc(): pipesInProc = [] for path in glob.glob('/proc/[0-9]*/fd/*'): try: mode = os.stat(path).st_mode if S_ISFIFO(mode): pid = int(re.search('[0-9]+', path).group(0)) pipesInProc.append((get_process_name_by_pid(pid, True), path)) except: pass return pipesInProc def get_sockets_in_proc(): socketsInProc = [] for path in glob.glob('/proc/[0-9]*/fd/*'): try: mode = os.stat(path).st_mode if S_ISSOCK(mode): pid = int(re.search('[0-9]+', path).group(0)) socketsInProc.append((get_process_name_by_pid(pid, True), path)) except: pass return socketsInProc def get_pipes_in_fs(): ''' NOT WORK! ''' pipesInFS = [] for root, subFolders, fileNames in os.walk('/'): for fileName in fileNames: path = os.path.join(root, fileName) if path[0:6] == '/proc/': break try: mode = os.stat(path).st_mode if S_ISFIFO(mode): pid = int(re.search('[0-9]+', path).group(0)) pipesInFS.append((get_process_name_by_pid(pid, True), path)) except: pass return pipesInFS def pretty_print(l, tableName=''): maxPnLen = max([len(x[0]) for x in l]) print '============' + (maxPnLen - 8) * '=' + '====================' print ' ' + tableName print ' process name' + (maxPnLen - 8) * ' ' + 'path (symlink)' print '============' + (maxPnLen - 8) * '=' + '====================' for pn, path in l: print str(pn) + (maxPnLen - len(pn) + 4)*' ' + str(path) if __name__ == '__main__': pipes = get_pipes_in_proc() pretty_print(pipes, 'Pipes') sockets = get_sockets_in_proc() pretty_print(sockets, 'Sockets')
Если я правильно понял, то все обнаруженные мною named pipe и сокеты в /proc имеют свой процесс. Значит надо искать тоже самое по всей системе,и если будет найден канал или сокет которого нету в /proc значит как раз его процесс и помер, забыв убить своё порождение?) Это если я правильно понял теорию)
def get_pipes_in_fs() не находит нигде никаких пайпов по системе (доступ в проц ему закрыт)…
Если кто понял ход моих мыслей, подскажите плз,а то я совершенно запутался (((