segmentacion - Error de segmentación de Python en el interruptor de subprocesos
segmentacion opencv python (1)
Estoy desarrollando una aplicación que debería verificar si la computadora puede hacer ping a google.com. Para hacer eso, uso el módulo de subproceso de Python y hago una llamada como se muestra en el siguiente código:
response = subprocess.call("ping -c 1 google.com -q", shell=True)
Sin embargo, después de ejecutarse durante un tiempo, el programa sale con una falla de segmentación.
Tengo el siguiente código:
daemon.py
def dataset_save(smartphone, mote):
print("DATA LOGGER:/tStarting Now")
with open(''dataset.csv'', ''a+'') as dataset:
dataset.write(str(datetime.datetime.today()) + '','' + /
str(datetime.datetime.today().weekday()) + '','' + /
str(smartphone.connected) + '','' + /
str(mote.A0_pw) + '','' + /
str(mote.B00_pw) + '','' + /
str(mote.B01_pw) + '','' + /
str(mote.B10_pw) + '','' + /
str(mote.B11_pw) + '','' + /
str(presence.get_value()) + '','' + /
str(temperature.get_value()) + '','' + /
str(luminosity.get_value()) + ''/n'')
print("DATA LOGGER: /tData successfully logged @ %s!" %str(datetime.datetime.today()))
return
def run():
check_internet()
while True:
dataset_save(smartphone, gateway)
check_presence()
check_internet.py
def check_internet():
response = subprocess.call("ping -c 1 google.com -q", shell=True)
print(response)
if response == 0:
print ("CONNECTIVITY: /tConnected to internet")
threading.Timer(1, check_internet).start()
return
else:
print("CONNECTIVITY: /tUnable to connect to internet")
threading.Timer(1, check_internet).start()
return
Ejecutando esto en GDB obtengo el siguiente rastro sobre el error de segmentación:
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 146.626/146.626/146.626/0.000 ms
0
CONNECTIVITY: Connected to internet
[New Thread 0xb55ffb40 (LWP 4064)]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb65ffb40 (LWP 4043)]
PING google.com (216.58.222.110) 56(84) bytes of data.
__deallocate_stack (pd=0xb65ffb40) at allocatestack.c:760
760 allocatestack.c: No such file or directory.
(gdb)
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 146.504/146.504/146.504/0.000 ms
(gdb) bt
#0 __deallocate_stack (pd=0xb65ffb40) at allocatestack.c:760
#1 0xb7fc3eab in start_thread (arg=0xb65ffb40) at pthread_create.c:427
#2 0xb7e8164e in clone () at ../sysdeps/unix/sysv/linux/i386/clone.S:129
(gdb)
¿Hay alguna razón por la que no deba usar threding.Timer como estoy usando? Me parece que la creación sucesiva de hilos es responsable de este error de segmentación.
Gracias.
Está rearmando el temporizador desde el propio temporizador, que puede no ser demasiado bueno (llamada recursiva con hilos, argh). Realmente no necesita el Timer
si no es demasiado exigente con la precisión del retardo del ping: podría iniciar un hilo que haga bucles y pings en Google periódicamente de esta manera:
import threading,subprocess,time
def check_internet():
while True:
time.sleep(1)
response = subprocess.call("ping -n 1 google.com".split())
print(response)
if response == 0:
print("CONNECTIVITY: /tConnected to internet")
else:
print("CONNECTIVITY: /tUnable to connect to internet")
t=threading.Thread(target=check_internet)
t.start()
print("Started")
t.join()
solo creas 1 hilo, que crea 1 proceso de ping cada 1+ segundos (no es un temporizador regulado, pero debería ser suficiente).
EDITAR: versión sin salida de ping
:
import threading,subprocess,time
def check_internet():
while True:
time.sleep(1)
p = subprocess.Popen("ping -n 1 google.com".split(),stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
out,err = p.communicate()
response = p.wait()
if response == 0:
print("CONNECTIVITY: /tConnected to internet")
else:
print("CONNECTIVITY: /tUnable to connect to internet")
t=threading.Thread(target=check_internet)
t.start()
print("Started")
t.join()