Sistema operacional terceiro relatório de experimento: pipeline

  • Nome: Zhu Duxin
  • ID do estudante: 201821121021
  • Classe: Calcular 1811

1. Escreva um programa

 1. Nomeação de canal (porque a leitura e gravação posteriormente especifica o nome do canal, então o processo de criação aqui também usa o método especificado no programa.)
  1 #include <stdio.h>
   2 #include <sys / types.h>
   3 #include <sys / stat.h>
   4  int main () {
   5      int temp = mkfifo ( " fifo " , 0777 ); // Criar Pipeline fifo
   6      if (temp == - 1 ) {// Retorna 0 se for bem-sucedido, -1
   7          perror ( " derrota " );
   8          return - 1 ;
   9      }
  10      return  0 ;
  11 }

 

Como o modo de parâmetro no int mkfifo ( const char * nome do caminho, mode_t mode); refere-se às permissões do arquivo de pipeline, simplesmente organizarei as permissões, o seguinte é o conteúdo representado por cada permissão:

 Autoridade  Explicação  Autoridade  Explicação
 r--  Somente leitura  -W-  Somente gravação
 --x Apenas executável   rw-  Legível e gravável
 -wx  Executável gravável  rx  Legível e executável
 rwx  Legível, gravável e executável  ---  Sem permissão

 E essas permissões são geralmente expressas em octal: (o binário também pode ser usado e o binário específico pode ser convertido por si só)

Autoridade Octal
--- 0 0
x 1
W 2
wx 3
r 4
rx 5
rw 6
rwx 7

Como se trata de um experimento, o modo é selecionado como 777, o que é conveniente para o experimento.

E criar um pipe famoso pode ser criado diretamente usando o comando mkfifo name.

2.fifo_read.c
  1 #include <unistd.h>
   2 #include <stdlib.h>
   3 #include <errno.h>
   4 #include < string .h>
   5 #include <fcntl.h>
   6 #include <stdio.h>
   7  
  8  int main () {
   9      int fifo_read = open ( " fifo " , O_RDONLY);
 10      if (fifo_read == - 1 ) {
  11          perror ( " aberto " );
 12          retorno - 1 ;
 13      }
  14 
 15     while ( 1 ) {
  16          char buffer [ 128 ] = { 0 };
 17          sinalizador int = leitura (fifo_read, buffer, 128 );
 18          if (flag == 0 ) {
  19              printf ( " está fechado " );
 20              pausas ;
 21          }
  22          printf ( " leia:% s de fifo \ n " , buffer);
 23      }
  24 
 25      close (fifo_read);
 26      retorno  0;
 27 }

 

3.fifo_write.c
  1 #include <stdio.h>
   2 #include <stdlib.h>
   3 #include <signal.h>
   4 #include <unistd.h>
   5 #include < string .h>
   6 #include <fcntl.h>
   7  
  8  int main () {
   9      int fifo_write = open ( " fifo " , O_WRONLY);
 10      if (fifo_write == - 1 ) {
  11          perror ( " aberto " );
 12          retorno - 1 ;
 13      }
  14 
 15     while ( 1 ) {
  16          char buffer [ 128 ] = { 0 };
 17          caracteres * encontrar;
 18          fgets (buffer, 128 , stdin);
 19          find = strchr (buffer, ' \ n ' );
 20          if (find) {
  21              * find = ' \ 0 ' ;
 22          }
  23          if (strcmp (buffer, " end " ) == 0 ) {
  24              break ;
 25          }
  26          write (fifo_write, buffer, strlen (buffer));
 27      }
  28      close (fifo_write);
 29      retorno  0 ;
 30 }

 

2. Analise os resultados da operação

 fifo_write write:

 

 fifo_read leia:

3. Gere novas perguntas e respostas através deste experimento

 Durante o primeiro teste, verificou-se que o leitor havia recebido as informações, mas o resultado da exibição não pôde ser exibido em uma linha completa, e o conteúdo após a recepção das informações não pôde ser exibido e não seria exibido até a próxima vez em que a mensagem foi recebida:

escrever:

ler:

 

 Analise o código e descubra que o problema é que, quando fgets () lê o conteúdo de entrada, ele grava o caractere de nova linha, o que faz com que a figura acima não seja exibida após o hello e o conteúdo original após o hello vai para a próxima linha, procurando no código O caractere de nova linha e substituí-lo podem efetivamente resolver o problema.

 

Acho que você gosta

Origin www.cnblogs.com/duxinZhu/p/12708207.html
Recomendado
Clasificación