GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie funktionieren *nix-Pseudo-Terminals? Was ist der Master/Slave-Kanal?

In Bezug auf den Master/Slave-Teil Ihrer Frage aus der pty(4)-Manpage (auf die von der openpty(3)-Manpage auf meinem System verwiesen wird):

Ein Pseudo-Terminal ist ein Paar Zeichengeräte, ein Master-Gerät und ein Slave-Gerät. Das Slave-Gerät stellt einem Prozess eine Schnittstelle zur Verfügung, die mit der in tty(4) beschriebenen identisch ist. Während jedoch alle anderen Geräte, die die in tty(4) beschriebene Schnittstelle bereitstellen, eine Art Hardware-Gerät hinter sich haben, hat das Slave-Gerät stattdessen einen anderen Prozess, der es durchführt die Haupthälfte des Pseudo-Terminals. Das heißt, alles, was auf dem Master-Gerät geschrieben wird, wird dem Slave-Gerät als Eingabe übergeben und alles, was auf dem Slave-Gerät geschrieben wird, wird als Eingabe auf dem Master-Gerät angezeigt.

Manpages sind deine Freunde.


Ich habe gerade die in diesem Tutorial gefundenen Beispiele ausprobiert, sie funktionieren sehr gut für mich und ich denke, sie sind ein interessanter Ausgangspunkt für das Problem.

EDIT:Das Tutorial erklärt kurz die Pseudo-Terminals-Funktion. Die Erklärung erfolgt Schritt für Schritt und wird von Beispielen gefolgt.

Das folgende Beispiel zeigt, wie ein neues Pseudo-Terminal und Fork erstellt werden der Prozess in zwei Teilen, einer schreibt auf dem Master Seite des Pseudo-Terminals, die andere liest vom Slave Seite des Pseudoterminals.

#define _XOPEN_SOURCE 600 
#include <stdlib.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <unistd.h> 
#include <stdio.h> 
#define __USE_BSD 
#include <termios.h> 


int main(void) 
{ 
int fdm, fds, rc; 
char input[150]; 

fdm = posix_openpt(O_RDWR); 
if (fdm < 0) 
{ 
fprintf(stderr, "Error %d on posix_openpt()\n", errno); 
return 1; 
} 

rc = grantpt(fdm); 
if (rc != 0) 
{ 
fprintf(stderr, "Error %d on grantpt()\n", errno); 
return 1; 
} 

rc = unlockpt(fdm); 
if (rc != 0) 
{ 
fprintf(stderr, "Error %d on unlockpt()\n", errno); 
return 1; 
} 

// Open the slave PTY
fds = open(ptsname(fdm), O_RDWR); 
printf("Virtual interface configured\n");
printf("The master side is named : %s\n", ptsname(fdm));

// Creation of a child process
if (fork()) 
{ 
  // Father
 
  // Close the slave side of the PTY 
  close(fds); 
  while (1) 
  { 
    // Operator's entry (standard input = terminal) 
    write(1, "Input : ", sizeof("Input : ")); 
    rc = read(0, input, sizeof(input)); 
    if (rc > 0) 
    {
      // Send the input to the child process through the PTY 
      write(fdm, input, rc); 

      // Get the child's answer through the PTY 
      rc = read(fdm, input, sizeof(input) - 1); 
      if (rc > 0) 
      { 
        // Make the answer NUL terminated to display it as a string
        input[rc] = '\0'; 

        fprintf(stderr, "%s", input); 
      } 
      else 
      { 
        break; 
      } 
    } 
    else 
    { 
      break; 
    } 
  } // End while 
} 
else 
{ 
struct termios slave_orig_term_settings; // Saved terminal settings 
struct termios new_term_settings; // Current terminal settings 

  // Child

  // Close the master side of the PTY 
  close(fdm); 

  // Save the default parameters of the slave side of the PTY 
  rc = tcgetattr(fds, &slave_orig_term_settings); 

  // Set raw mode on the slave side of the PTY
  new_term_settings = slave_orig_term_settings; 
  cfmakeraw (&new_term_settings); 
  tcsetattr (fds, TCSANOW, &new_term_settings); 

  // The slave side of the PTY becomes the standard input and outputs of the child process 
  close(0); // Close standard input (current terminal) 
  close(1); // Close standard output (current terminal) 
  close(2); // Close standard error (current terminal) 

  dup(fds); // PTY becomes standard input (0) 
  dup(fds); // PTY becomes standard output (1) 
  dup(fds); // PTY becomes standard error (2) 

  while (1) 
  { 
    rc = read(fds, input, sizeof(input) - 1); 

    if (rc > 0) 
    { 
      // Replace the terminating \n by a NUL to display it as a string
      input[rc - 1] = '\0'; 

      printf("Child received : '%s'\n", input); 
    } 
    else 
    { 
      break; 
    } 
  } // End while 
} 

return 0; 
} // main

Linux
  1. Was ist NGINX? Wie funktioniert es?

  2. Was ist ein Webserver und wie funktioniert ein Webserver?

  3. Wie funktionieren Tastatureingabe und Textausgabe?

  4. Wie funktioniert das Sticky Bit?

  5. Wie funktionieren die Interna von Sudo?

Was ist ein Makefile und wie funktioniert es?

So richten Sie die MySQL-Master-Slave-Replikation ein

Wie funktioniert ein Load Balancer? Was ist Load-Balancing?

Was bedeutet *nix?

Wie funktioniert der ps-Befehl?

Wie funktioniert die Loopback-Schnittstelle?