2017-02-20 4 views
0

Ich erstelle also einen Signalhandler, um die Geschwindigkeit zu ändern, mit der die Ausgabe auf dem Bildschirm gedruckt wird. Die Ausgabe erfolgt durch einen Prozess, der zu einem anderen geöffneten Terminal druckt, während der Benutzer noch Eingabe wie "+" eingeben kann, um die Geschwindigkeit zu erhöhen, und "-", um die Geschwindigkeit zu verringern.Senden einer Variablen, die durch ein Signal in einen Prozess geändert wurde, der von exec im untergeordneten Prozess erstellt wurde [C]

Der Code sieht in etwa so aus.

static state* start_button(void) 
{ 
    state *destination;               

    pid_t pid;              
    pid = fork();             
    switch(pid)             
    {                   
     case -1:         
      destination = &ready;            
      break;                
     case 0:                   
      execl("./outputTerminal", 
       "outputTerminal",file_number,"/dev/ttys001",NULL);                  
      break;                
     default:                
      destination = &going;            
      break;                
    }                   

    return destination; 
} 

Im gehen Zustand (going.c) mein Gedankengang war, um flüchtige Variablen Sekunden und Nanosekunden zu erstellen und diese Variablen verwenden, um die nanosleep() Funktion zu aktualisieren, die Ausgangsklemme der Zeilen 1 Zeile zu einem Zeitpunkt zu lesen verwendet wie so in das Code-Snippet unten. Ist das möglich? Das ist eine Hausaufgabenfrage übrigens. Ich habe alle Funktionen, die funktionieren, wie sie sollen Ich muss nur herausfinden, wie man die durch das Signal veränderten Variablen an diesen Prozess sendet. Ich habe versucht, kill(baby_pid,SIGUSR1) in den Zustand zu gehen, nachdem ich die Signal-Handler gesetzt, weil ich die PID gespeichert, aber das nur tötet den Prozess outputTerminal aus irgendeinem Grund.

//going.c 
volatile sig_atomic_t seconds; 
volatile sig_atomic_t nanoseconds; //Update these in the going state 

//Then pass them to the process outputTerminal like so 


//outputTerminal.c 
struct timespec tm1,tm2; 
tm1.tv_sec = seconds; 
tm2.tv_nsec = nanoseconds; 
nanosleep(&tm1,&tm2); 

Das ist mein Signal-Handler

static void speed_handler(int signal)           
{                    
    long max_nano = 1000000000L;            
    long incrementer = 250000000L;            
    if(speed_control == 0)              
    {                   
     if(nanoseconds == 0L && seconds > 0)         
     {                  
      seconds -= 1;              
      nanoseconds = max_nano;            
     }                  

     if(nanoseconds != 0L)             
      nanoseconds -= incrementer;           
    }                   

    if(speed_control == 1)              
    {                   
     nanoseconds += incrementer;            
     if(nanoseconds >= max_nano)            
     {                  
      nanoseconds = 0L;             
      seconds += 1;              
     }                  
    }                   
} 

Antwort

0

Was Sie suchen ist IPC genannt, die Abkürzung für Interprozesskommunikation und es gibt viele Möglichkeiten zu tun, was Sie wollen. Ihr Ansatz funktioniert nicht, da Ihre Prozesse unterschiedliche Adressräume haben, so dass das Ändern einer Variablen in der einen keine Auswirkung auf die andere hat.

Ein paar Möglichkeiten, in denen Sie Informationen von einem Prozess zum anderen kommunizieren können:

Es gibt einige weitere Mechanismen, aber das sollte Ihnen den Anfang machen.

+0

Also habe ich den Code so geändert, wie er eigentlich machen soll. Erstellen Sie einfach ein Kind und verwenden Sie execl. Wir werden anscheinend nur Signale dafür verwenden, die für mich keinen Sinn ergeben. Sigqueue sah aus, als wäre es nett, aber anscheinend nicht unterstützt auf Mac Sierra – WizKiz

+0

Okay, was ich getan habe, um mein Problem zu beheben, ist, legte ich den Signalhandler in den Prozess, der den Text auf dem anderen Terminal gedruckt wurde und dann meine Elternprozess verwendet um Signale an sie zu senden, und ich habe zwei Signale verwendet, um die Geschwindigkeit zu erhöhen und die Geschwindigkeit zu verringern. – WizKiz

+0

@WizKiz Ein Problem mit "klassischen" Signalen ist, dass man nicht sicher ist, ob der Zielprozess das Signal empfängt (und man ist nicht sicher, was passiert, wenn das Signal mehrmals in schneller Folge gesendet wird). – cnicutar

Verwandte Themen