GNU/Linux >> Linux Esercitazione >  >> Linux

Come funzionano gli pseudo-terminali *nix? Qual è il canale master/slave?

Per quanto riguarda la parte master/slave della tua domanda, dalla pagina man pty(4) (a cui fa riferimento la pagina man openpty(3) sul mio sistema):

Uno pseudo terminale è una coppia di dispositivi a caratteri, un dispositivo master e un dispositivo slave. Il dispositivo slave fornisce a un processo un'interfaccia identica a quella descritta in tty(4). Tuttavia, mentre tutti gli altri dispositivi che forniscono l'interfaccia descritta in tty(4) hanno dietro di sé un dispositivo hardware di qualche tipo, il dispositivo slave ha, invece, un altro processo che lo manipola attraverso la metà master dello pseudo terminale. Cioè, qualsiasi cosa scritta sul dispositivo master viene data al dispositivo slave come input e qualsiasi cosa scritta sul dispositivo slave viene presentata come input sul dispositivo master.

Le pagine man sono tue amiche.


Ho appena provato gli esempi trovati in questo tutorial, funzionano molto bene per me e penso che siano un punto di partenza interessante per il problema.

EDIT:Il tutorial spiega brevemente la funzione pseudo-terminali. La spiegazione è fatta passo dopo passo ed è seguita da esempi.

L'esempio seguente mostra come creare un nuovo pseudo-terminale e fork il processo in due parti, una scritta sul maestro lato dello pseudo-terminale, l'altro leggendo dallo slave lato dello pseudo-terminale.

#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. Cos'è NGINX? Come funziona?

  2. Quali sono le responsabilità di ciascun componente pseudo-terminale (pty) (software, lato master, lato slave)?

  3. Come funzionano gli interni del demone Cron?

  4. Come segnalare la fine dell'ingresso Stdin?

  5. Cos'è il DNS e come funziona?

Come impostare la replica MySQL Master Slave

Come funziona un sistema di bilanciamento del carico? Che cos'è il bilanciamento del carico?

Come funzionano le macro probabili/improbabili nel kernel di Linux e qual è il loro vantaggio?

Qual è il significato di *nix?

Come funzionano le opzioni '-s', '-t' e '-c' del comando tr in Unix?

Come funziona l'interfaccia di loopback