Sincronização entre Processos


Informação complementar:

Esta aula tem por objetivo introduzir a sincronização entre processos através da utilização de sinais e semáforos. Para tal, deverá implementar pequenos programas que respondam aos requisitos de cada uma das tarefas que se seguem. Para obter mais informação sobre as funções de sistema referidas, consulte as man-pages respetivas.

  1. Apanhar sinais: o programa deve definir um handler para alterar o tratamento a dar a alguns sinais.
    1. Comece por definir um handler para apanhar os sinais SIGTSTP (enviado pelo terminal quando se usa CTRL-Z) e SIGINT (enviado pelo terminal quando se usa CTRL-C), imprimindo nesses casos uma mensagem adequada. Depois de instalar o handler, o programa deve imprimir o seu PID e, por fim, entrar num ciclo infinito. Com o programa a correr, experimente na shell usar o CTRL-Z e o CTRL-C para interromper o processo. O que acontece e porquê?
      Nota: poderá terminar o processo enviando-lhe o sinal SIGTERM. Para isso deverá invocar numa outra shell o comando "kill -15" para o PID que o programa imprimiu.
    2. Altere o programa para apanhar também os sinais SIGTERM e SIGKILL. Qual é a razão da diferença de comportamento do programa na recepção dos sinais SIGTERM e SIGKILL?
      Nota: para enviar o sinal SIGKILL ao processo deverá invocar numa outra shell o comando "kill -9" para o PID que o programa imprimiu.
    Funções a ter em conta: signal() e pause().
  2. Sincronização por sinais: o programa deve criar um processo filho e o processo pai deverá imprimir a mensagem "PAI" e o processo filho deverá imprimir a mensagem "FILHO". Recorrendo à troca de sinais do tipo SIGUSR1 entre pai e filho, garanta que:
    1. O pai imprime sempre a sua mensagem antes do filho.
    2. O filho imprime sempre a sua mensagem antes do pai.
    Funções a ter em conta: signal() e kill().
  3. Sincronização por semáforos I: resolva novamente o exercício anterior, recorrendo agora a semáforos para controlar a ordem de impressão das mensagens do pai e do filho.
    Funções a ter em conta: sem_open(), sem_wait(), sem_post(), sem_close() e sem_unlink().
  4. Sincronização por semáforos II: o programa deve criar um processo filho e ambos os processos (pai e filho) devem imprimir alternadamente linhas, de modo a obter uma sequência semelhante à seguinte:
        Filho: 1 
        Pai: 2 
        Filho: 3 
        ...  
        Pai: 18
        Filho: 19
        Pai: 20
    O processo filho deve imprimir as linhas ímpares e o processo pai as linhas pares, até atingirem um determinado valor (20 no exemplo). Cada processo deverá ter associado um semáforo. Para indicar ao outro processo a sua vez de imprimir, o processo deverá sinalizar o semáforo associado a esse processo. Deverá depois aguardar (no seu semáforo) que o outro processo lhe passe novamente a vez de imprimir.
    Funções a ter em conta: sem_open(), sem_wait(), sem_post(), sem_close() e sem_unlink().