Création de processus

Texte intégral

(1)

Création de processus

(2)

Forking

• Cloner des processus

• Fork permet de créer un processus identique au parent

• Le thread en execution est dupliqué exactement au point ou on appel le fork()

Retourne 0 chez l’enfant

Retourne le PID de l’enfant chez le parent

• Le PID du parent et de l’enfant sont différents

(3)

Vim fork-demo.py

#!/usr/bin/env python

Import os

Def child_process () :

Print ‘’ i am a child process and my PID is %d’’%os.getpid()

Print ‘’the child is exiting’’

Def parent_process()

Print ‘’ i am a parent process with PID %d’’%os.getpid()

Childpid = os.fork()

If childpid == 0 :

#we are inside child

Child_process()

Else :

#we are inside a parent process

Print‘’we are inside a parent process’’

Print‘’our childhas the PID : %d’’ %childpid

While true :

Pass

Parent_process()

(4)

• Chmod a+x fork-demo.py

• ./fork-demo.py

(5)

Threading and queues

(6)

Threading et files d’attentes

• Créer une queue de taches

• Thread reçoivent les taches

• Threads finalisent la tache et informent la queue

• Tous les thread quittent une fois la queue vide

(7)

• Ouvrez votre terminal

• Vim q.py

• #!/usr/bin/env python

• Import threading

• Import Queue

• Import time

• On va commencer par créer la queue des taches

• queue = Queue.Queue()

• Là on va imaginer une classe travailleur qui va récupérer les taches à partir de la queue pour les executer

(8)

• #!/usr/bin/env python

• Import threading

• Import Queue

• Import time

• class WorkerThread(threading.Thread) :

def __init__(self, queue) :

threading.Thread.__init__(self)

self.queue = queue

• Queue = Queue.Queue()

(9)

#!/usr/bin/env python

Import threading

Import Queue

Import time

class WorkerThread(threading.Thread) :

def __init__(self, queue) :

Threading.Thread.__init__(self)

Self.queue = queue

def run(self) :

print ‘’in workerThread’’

while True :

counter = self.queue.get()

print‘’Ordered to sleep for %d seconds!’’%counter

Time.sleep(counter)

print‘’Finishedsleeping for %d seconds’’%counter

Self.queue.task_done()

queue = Queue.Queue()

Maintenant il faut penser à créer le worker thread

(10)

#!/usr/bin/env python

Import threading

Import Queue

Import time

class WorkerThread(threading.Thread) :

def __init__(self, queue) :

Threading.Thread.__init__(self)

Self.queue = queue

def run(self) :

print‘’in workerThread’’

while True :

counter = self.queue.get()

print‘’Ordered to sleepfor %d seconds!’’%counter

Time.sleep(counter)

print‘’Finishedsleeping for %d seconds’’%counter

Self.queue.task_done()

Queue = Queue.Queue()

for i in range(10) :

Print‘’creating workerThread:%d’’%i

worker = WorkerThread(queue)

worker.setDaemon(True)

worker.start()

print‘’WorkerThred %d Created!’’%i

Maintenant nous avons notre worker thread nous avons notre petite boucle et nous avons créée tous nos workerthread

La grande question ou allons nous poser les taches

Notre queue a été créée (Queue = Queue.Queue() ) et elle est passée en argument à la création du worker

(11)

#!/usr/bin/env python

Import threading

Import Queue

Import time

class WorkerThread(threading.Thread) :

def __init__(self, queue) :

Threading.Thread.__init__(self)

Self.queue = queue

def run(self) :

print‘’in workerThread’’

while True :

counter = self.queue.get()

print‘’Ordered to sleepfor %d seconds!’’%counter

Time.sleep(counter)

print‘’Finishedsleeping for %d seconds’’%counter

Self.queue.task_done()

queue = Queue.Queue()

for i in range(10) :

Print‘’creating workerThread:%d’’%i

worker = WorkerThread(queue)

worker.setDaemon(True)

worker.start()

print‘’WorkerThred %d Created!’’%i

for j in range (10) :

queue.put(j)

queue.join()

Print‘’all tasksover’’

Enregistrer et quitter

(12)

• Python q.py

(13)

Solution de l’exercice directory traversal

#!/usr/bin/python

import os

import sys

pre = ''

for (path, dirs, files) in os.walk(sys.argv[1]) :

depth_from_root = len(path.split('/'))

print '-'*(depth_from_root*4 +8) + ' [' + path.split('/')[-1] + ']'

for file in files :

print '-'*(depth_from_root*4 +12) + ' ' +file

#print '-'*(depth_from_root +12) + ' Files: ' + str(files)

(14)

Solution de l’exercice directory traversal

Chmod a+x exo-dir.py ./exo-dir.py ../A/

(15)

Programmation client- serveur

Python for security

(16)

Programmation réseau

• Programmation des sockets deux types :

Socket TCP & UDP

Clients et serveurs réguliers

Raw Sockets (sockets brutes )

Sinfing et injection

(17)

Programmation client et serveur

• Serveur

Offre un service

• Client

Utilise ou consomme un service

• Utilisation du module Socket

(18)

Serveur TCP simple et client

(19)

• Ouvrez l’interpréteur python

• import socket

• tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

• Là vous avez créé une TCP Socket pour écouter sur un port spécifique de la machine serveur

• Nous utilisons la méthode socket qui prend deux arguments

socket.AF_INET : adress family pour les applications internet on utilise tjr AF_INET

SOCK_STREAM : le type de socket nous utilisons SOCK_STREAM pour TCP et DATAGRAM socket pour UDP

• Là on a créé notre socket

(20)

• Ouvrez l’interpréteur python

• import socket

• tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

• tcpSocket.bind((‘’0.0.0.0’’, 8000))

Les 0.0.0.0 représentent l’adresse de l’interface

8000 le numéro de port

(21)

• Ouvrez l’interpréteur python

• import socket

• tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

• tcpSocket.bind((‘’0.0.0.0’’, 8000))

• tcpSocket.listen(2)

2 représentente le nombre de clients concurrents autorisés

(22)

Ouvrez l’interpréteur python

import socket

tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

tcpSocket.bind((‘’0.0.0.0’’, 8000))

tcpSocket.listen(2)

(client, ( ip, port)) = tcpSocket.accept()

La méthode accept retourne le couple (client : qui identifie le client avec qui vous etablissez la connexion ce qui veut dire pour chaque nouveau client accepté une

nouvelle socket sera créée) la seconde partie consiste en @ip et n°de port distant du client

Maintenant ouvrez un autre terminal pour simuler un client

Taper ifconfig pour verifier l’@ IP du serveur

nc @ip du serveur 8000

Rien ne va s’afficher mais le client est connecté

(23)

Revenez vers le 1er terminal

Client

Vous aurez comme réponse <socket._socketobject object at 0x……>

ip

Vous aurez l’@ip du client

Port

Vous aurez le numéro de port distant

Pour envoyer des informations au client il suffit de faire

client.send(‘’bienvenue à notre TP’’)

Vous remarquerez que le message s’affiche chez le client

De la même manière si vous souhaitez recevoir des données de chez le client

data = client.recv(2048)

Sur le client taper ceci est mon premier exemple client serveur

Revenez au serveur et taper

data

(24)

• Si vous quittez l’interpreteur, il sera automatiquement mis fin à cette liaison

(25)

• À la lumière de ce que vous avez vu maintenant vous avez 10mn pour m’envoyer le programme qui permet de créer un écho server

• Un echo server est un serveur qui renvoie tout ce qu’il reçoit vers la source émettrice

• Solution

• while len(data)

data= client.recv(2048)

Print ‘’client sent :’’ ,data

Client.send(data)

• Print ‘’closing connection’’

• client.close()

• print ‘’shutting down server’’

• tcpSocket.close()

(26)

• Si le programme serveur est arrété de manière incorrecte vous remarquerez au redemarrage un message d’erreur indiquant

• Errno 98 address already in use

• C’est un problème récurrent

• Pour l’éviter il faut rajouter la ligne suivante juste apres la création de la socket

• tcpSocket.setsockopt(socket.sol_SOCKET, socket.SO_REUSEADDR, 1)

Figure

Updating...

Références

Updating...

Sujets connexes :