Can someone please take a look at my code, specifically part of signals and handler? It’s not working in a sense that handler doesn’t write signal in document on desktop that should be created…
Thank you in advance
import os
import math
import signal
import threading, time
from threading import Thread
from sys import exit
def handler(naziv_signala, stog):
"""
Pohranjuje 15. i 17. signal u tekstualnu datoteku na radnoj površini.
"""
print("Naziv signala: ".format(naziv_signala))
file = open((os.path.expanduser("~/Desktop")) + "/signal_stack.txt", "w")
file.write(str(stog))
file.close()
print("Datoteka je pohranjena na radnoj površini.")
def PrviZadatak(n):
"""
Ispisi pid, ime korisnika, i prioritet procesa.
"""
t_end = time.time() + n # t_end je vrijeme zavrsetka, +n za broj sekundi koje ce se izvodit
while time.time() < t_end:
home = os.path.expanduser('~')
os.chdir(home)
broj_podprocesa = int(os.popen("ps --no-headers -o pid --ppid=$$ | wc -w").read())
if broj_podprocesa < 2:
print("Ne postoje 3 procesa!")
# os.popen() otvara cijev koja povlači uneseni podatak i čita ga ili ispisuje ovisno o unosu r/w
korisnik = os.getlogin()
dijete = os.getpid()
roditelj = os.getppid()
deda = int(os.popen("ps -p %d -oppid=" % os.getppid()).read().strip())
prioritet1 = os.getpriority(os.PRIO_PROCESS, dijete)
prioritet2 = os.getpriority(os.PRIO_PROCESS, roditelj)
prioritet3 = os.getpriority(os.PRIO_PROCESS, deda)
print("PID\t\t\tKorisnik\t\tPrioritet")
print(dijete, "\t\t", korisnik, "\t\t", prioritet1)
print(roditelj, "\t\t", korisnik, "\t\t", prioritet2)
print(deda, "\t\t", korisnik, "\t\t", prioritet3)
semafor1 = threading.Semaphore(2) # početna vrijednost brojača 2
suma = 0
def ZbrojKorijena(poc, kraj):
"""
Zbraja elemente liste brojeva koja se prima kao argument u intervalu koji se proslijeduje kao argumenti u funkciji
Interval [pocetak, kraj>
"""
semafor1.acquire()
global suma
dat = open("steps.txt", "a")
while poc < kraj:
suma = suma + math.sqrt(poc)
# ispisi u datoteku
dat.write('{}: {}\n'.format(poc, suma))
poc = poc + 1
dat.close()
semafor1.release()
return suma
semafor = threading.Semaphore() # klasa za definiranje objekta koji predstavlja semafor s vrijednošću brojača ()
def brojac(m, trajanje):
"""
sinkronizira trajanje rada dretvi tako da je isti jednako raspoređen
"""
for i in range(m):
semafor.acquire()
m -= (i ** 2)
semafor.release()
time.sleep(1)
trajanje += 1
def createListOfDividers(poc, kraj, k):
"""
Racuna djelitelje broja unutar intervala [1,k]
"""
lock.acquire()
if kraj == k:
global nameTwo
nameTwo = threading.currentThread().getName()
else:
global nameOne
nameOne = threading.currentThread().getName()
if threadOne.is_alive():
print('{} je poceo sa izvodenjem'.format(nameOne))
if threadTwo.is_alive():
print('{} je poceo sa izvodenjem'.format(nameTwo))
global dividers
for m in range(1, kraj + 1):
for l in range(1, m + 1):
if (m % l) == 0:
dividers.append(l)
lock.release()
def createListOfEvenNumbers(lista):
"""
Izdvaja parne djelitelje pri zavrsetku izrade liste istih, to jest rada prve dvije dretve
"""
global vrijeme_izvodenja
lock.acquire()
vrijeme_izvodenja = time.process_time()
global nameThree
nameThree = threading.currentThread().getName()
print('{} je poceo sa izvodenjem'.format(nameThree))
global evenNumbers
for j in lista:
if j % 2 == 0:
evenNumbers.append(j)
print('Lista parnih brojeva: ')
print(evenNumbers)
lock.release()
def settings():
"""
Ispis glavnog menija
"""
print("1 Ispis tablice vrijednosti\n"
"2 Unos naziva signala\n"
"3 Proračun zbroja drugih korijena svih vrijednosti intervala\n"
"4 Ispis djelitelja vrijednosti")
print("Dobrodošli u program Seminarski rad. Slijedi glavni izbornik:")
settings()
choice = input("Unesite redni broj ispred funkcionalnosti koju želite pokrenuti: ")
while choice != "end" and choice != "kraj":
while choice == "":
choice = input("Unesite redni broj ispred funkcionalnosti koju želite pokrenuti: ")
if choice == "1":
n = int(input("Unesite cjelobrojnu vrijednost n manju od 10:"))
while n > 10:
n = int(input("Unesite cjelobrojnu vrijednost n manju od 10:"))
if n < 10:
PrviZadatak(n)
settings()
choice = input("Ponovno unesite redni broj ispred funkcionalnosti koju želite pokrenuti:")
break
if choice == "2":
value = input("Unesite naziv signala koji želite poslati trenutnom procesu:")
value = value.upper()
while value == "":
value = input("Unesite naziv signala koji želite poslati trenutnom procesu:")
if value == 'SIGTERM' or value == 'TERM':
signal.signal(signal.SIGTERM, handler)
print("Pristignuti signal se upisuje u datoteku na radnoj površini")
settings()
choice = input("Ponovno unesite redni broj ispred funkcionalnosti koju želite pokrenuti:")
elif value == 'SIGCHLD' or value == 'CHLD':
signal.signal(signal.SIGCHLD, handler)
print("Pristignuti signal se upisuje u datoteku na radnoj površini")
settings()
choice = input("Ponovno unesite redni broj ispred funkcionalnosti koju želite pokrenuti:")
elif value == 'SIGQUIT' or value == 'QUIT':
signal.signal(signal.SIGQUIT, signal.SIG_IGN)
print("Signal se ignorira.")
settings()
choice = input("Ponovno unesite redni broj ispred funkcionalnosti koju želite pokrenuti:")
elif value == 'SIGHUP' or value == 'HUP':
signal.signal(signal.SIGHUP, signal.SIG_IGN)
print("Signal se ignorira.")
settings()
choice = input("Ponovno unesite redni broj ispred funkcionalnosti koju želite pokrenuti:")
elif value == 'SIGINT' or value == 'INT':
signal.signal(signal.SIGINT, signal.SIG_IGN)
print("Signal se ignorira.")
settings()
choice = input("Ponovno unesite redni broj ispred funkcionalnosti koju želite pokrenuti:")
else:
signal.signal(signal.SIGILL, signal.SIG_DFL)
signal.signal(signal.SIGTRAP, signal.SIG_DFL)
signal.signal(signal.SIGABRT, signal.SIG_DFL)
signal.signal(signal.SIGBUS, signal.SIG_DFL)
signal.signal(signal.SIGFPE, signal.SIG_DFL)
signal.signal(signal.SIGKILL, signal.SIG_DFL)
signal.signal(signal.SIGUSR1, signal.SIG_DFL)
signal.signal(signal.SIGSEGV, signal.SIG_DFL)
signal.signal(signal.SIGCONT, signal.SIG_DFL)
signal.signal(signal.SIGSTOP, signal.SIG_DFL)
signal.signal(signal.SIGTSTP, signal.SIG_DFL)
signal.signal(signal.SIGTTIN, signal.SIG_DFL)
signal.signal(signal.SIGVTALRM, signal.SIG_DFL)
signal.signal(signal.SIGPROF, signal.SIG_DFL)
signal.signal(signal.SIGWINCH, signal.SIG_DFL)
signal.signal(signal.SIGIO, signal.SIG_DFL)
signal.signal(signal.SIGPWR, signal.SIG_DFL)
signal.signal(signal.SIGSYS, signal.SIG_DFL)
break
if choice == "3":
m = int(input("Unesite cjelobrojnu vrijednost m veću od 5 milijuna:"))
while m < 5000000:
print('\nPogresan unos, probajte ponovno')
m = int(input("Unesite cjelobrojnu vrijednost m veću od 5 milijuna:"))
poc1 = 0
ostatak = 0
kraj = True
while kraj:
if m % 3 == 0:
kraj1 = m / 3
kraj = False
else:
m = m - 1
ostatak = ostatak + 1
poc2 = kraj1
kraj2 = poc2 + kraj1
poc3 = kraj2
kraj3 = m + ostatak
# pokreni tri dretve koje izvode funkciju ZbrojKorijena, svaka na svom intervalu
p1 = Thread(target=ZbrojKorijena, args=(poc1, kraj1))
p2 = Thread(target=ZbrojKorijena, args=(poc2, kraj2))
p3 = Thread(target=ZbrojKorijena, args=(poc3, kraj3))
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
p3.join()
print('Gotovo izvodenje')
break
if choice == "4":
k = int(input("Unesite cjelobrojnu vrijednost k, ne manju od 1000 i ne veću od 200 000:"))
while 1000 >= k >= 2000000:
k = input("Unesite cjelobrojnu vrijednost k, ne manju od 1000 i ne veću od 200 000:")
k = int(k)
evenNumbers = []
dividers = []
lock = threading.RLock()
kraj = True
ostatak = 0
while kraj:
if k % 2 == 0:
poc = int(k / 2)
kraj = False
else:
k = k - 1
ostatak = ostatak + 1
k = k + ostatak
threadOne = threading.Thread(target=createListOfDividers, args=(1, poc, k,))
threadTwo = threading.Thread(target=createListOfDividers, args=(poc, k, k,))
threadThree = threading.Thread(target=createListOfEvenNumbers, args=(dividers,))
threadOne.start()
threadOne.join()
threadTwo.start()
threadTwo.join()
if threadOne.is_alive():
print(
'Dretva se jos izvodi')
# ne izvodi se zbog join (dretva zavrsi izvodenje prije nego sto se dode do if-a)
else:
print('{} je zavrsio sa izvodenjem'.format(nameOne))
if threadTwo.is_alive():
print('Dretva se jos izvodi')
else:
print('{} je zavrsio sa izvodenjem'.format(nameTwo))
print('\nLista djeljitelja je napravljena')
threadThree.start()
threadThree.join()
if threadThree.is_alive():
print(
'Dretva se jos izvodi')
# ne izvodi se zbog join (dretva zavrsi izvodenje prije nego sto se dode do if-a)
else:
print('{} je zavrsio sa izvodenjem'.format(nameThree))
print("Vrijeme izvodenja dretve {} = {}".format(nameThree, time.process_time()))
break
settings()
choice = input("Ponovno unesite redni broj ispred funkcionalnosti koju želite pokrenuti:")
if choice == "end" and choice == "kraj":
exit()