2016-02-18 2 views
0

Я пытаюсь закодировать сервер сокета с fork в python. как-то новая вилка будет создана, когда клиент подключен, и этот процесс вилки будет обрабатывать соединение, включая send/receive.
Я запустил этот скрипт на Linux centOS и просмотрел ресурсы с помощью htop/top, чтобы увидеть, сколько вилок (задач) показано. проблема заключается в том, что я убиваю некоторые вилки с помощью os._exit(0). htop не будет изменен (естественно, его нужно уменьшить, убивая вилки), и когда я закрою скрипт python, все вернется к нормальной жизни (использование и задачи использования Ram).
, так что я должен сделать это, когда я убью какую-то вилку, используя os._exit(0), она воздействует на htop в другой руке, освобождает все ресурсы и не дожидается, пока его собственный родитель не будет убит?

здесь это код для создания вилка:выход и очистка вилка python

def test(sock): 
    //handle socket then return 
for i in range (1000): 
    sock,addr=socket.accept() 
    pid=os.fork() 
    if pid==0: 
      test(sock) 
      os._exit(0) 
    elif pid !=-1: 
      os.waitpid(-1, os.WNOHANG) 

ответ

2

Родительского процесс должен ждать ребенок для того, чтобы ресурсы процесса ребенка должны быть освобождены. До тех пор этот процесс до сих пор существует в «зомби» состоянии, и он все равно будет появляться в ps и top т.д.

Вы можете позвонить по одному из os.wait(), os.waitpid(), os.wait3() или os.wait4().

os.wait3() с os.WNOHANG вариант может быть наиболее полезным для вас, как он будет ждать любого дочернего процесса, и родитель не будет блокировать, пока ребенок не прекращает (или его изменения состояния - wait будет возвращать дочерние процессы, которые были остановлены или перезапущены слишком).

Более подробную информацию о базовых системных вызовах можно найти на странице руководства Linux: man 2 wait.

+0

Я использовал 'os.waitpid (childPID, 0)' в родительском. но родительский интерфейс не принимает никакого соединения до тех пор, пока дочерний процесс не завершится и не выйдет. Но мне нужно, когда я использую 'os._exit (0)' в процессе fork, он исчезает в ps или top. в другой руке освободите все ресурсы. но теперь, если я создаю 1000 вилок и даже уничтожу их всех ('os._exit (0)'), кажется, что 'top или ps' по-прежнему показывает задачи = 1000. кажется, что вилка не была чистой или что-то в этом роде. но когда я завершаю процесс python и останавливаю каждый, тогда все будет хорошо. –

+0

@MehrdadDadvand: родитель не будет принимать никаких подключений, потому что он заблокирован, ожидая завершения завершения. Вы можете запустить 'os.waitpid (childPID, os.WNOHANG)', и родительский элемент не будет блокироваться и будет возвращать '(0, return_code)', указывающий, что ребенок завершен, или (childPID, return_code), если он этого не сделал. Я упомянул 'os.wait3 (os.WNOHANG)' в своем ответе, который почти такой же, как 'os.waitpid (-1, os.WNOHANG), но он возвращает дополнительную информацию о ресурсе о ребенке, которая может быть полезна для регистрации в вашем родительском процессе. – mhawke

+0

это работает. спасибо много –