Python program with signals

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 :hugs:

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()

Welcome to the forums @KarlaJokic

[off-topic]
When you post code in the forum, you need to format it. To do so you can either select all the code and click the </> button, or type 3 backticks ``` on a separate line both before and after the code block.

I have done it for you this time.
[/off-topic]

Noted :slight_smile: Thank you.

1 Like

This topic was automatically closed 91 days after the last reply. New replies are no longer allowed.