C/Visual C - Programar una terminal en c

 
Vista:
sin imagen de perfil
Val: 7
Ha disminuido su posición en 7 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Programar una terminal en c

Publicado por Jesus (7 intervenciones) el 23/03/2019 14:20:17
Buenas, estoy de Erasmus y para aprobar la asignatura de Sistemas operativos tengo que realizar una terminal en c, lo que implica que entienda los comandos ls cd mkdir y todos los demás, ademas me piden que al usar las flechas del ordenador pueda reutilizar los comandos ya puestos, vamos como si fuese la propia terminal, el problema es que nunca he programado en c y no se ni como hacerlo, les adjunto en este enlace el enunciado.
1
http://ciprianpungila.com/uvt/so2018/projects/35.txt
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Programar una terminal en c

Publicado por Tom (610 intervenciones) el 23/03/2019 19:33:25
Tienes un problemilla. No es "la terminal" quien interpreta ningún comando ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 7
Ha disminuido su posición en 7 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Programar una terminal en c

Publicado por Jesus (7 intervenciones) el 24/03/2019 17:19:00
Y como podría realizarlo, la cosa es que he encontrado ya un código pero no implementa lo de las flechas para elegir instrucciones anteriores por lo que solo me faltaría implementar eso, como podría realizarlo, gracias de antemano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Programar una terminal en c

Publicado por Tom (610 intervenciones) el 24/03/2019 18:17:21
¿ Por qué no pegas aquí el enunciado ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 7
Ha disminuido su posición en 7 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Programar una terminal en c

Publicado por Jesus (7 intervenciones) el 24/03/2019 22:50:13
http://ciprianpungila.com/uvt/so2018/projects/35.txt
Aqui esta el enunciado, no lo pego porque es bastante largo. Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Programar una terminal en c

Publicado por Tom (610 intervenciones) el 25/03/2019 08:43:35
O sea, que copiarás probablemente bash, csh o ksh ...
Echa un ojo a la librería readline que usa bash.

https://tiswww.case.edu/php/chet/readline/readline.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 7
Ha disminuido su posición en 7 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Programar una terminal en c

Publicado por Jesus (7 intervenciones) el 25/03/2019 14:08:13
Sinceramente no se ni lo que es eso, le he echado un ojo mas o menos a todo y no he sacado nada en claro, el código que tengo yo del programa realizado es este, y solo hace falta implementar lo de las flechas si no me equivoco. Gracias.
Lo adjuntado es el código en c que hay que compilar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Programar una terminal en c

Publicado por Tom (610 intervenciones) el 25/03/2019 17:47:47
Creo que puedes empezar a agobiarte. La parte que te han hecho no cuadra con lo que te piden.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Programar una terminal en c

Publicado por Jesus (7 intervenciones) el 25/03/2019 17:52:41
Realmente lo que me piden para el 5 es esto que yo creo que es lo que he hecho a falta de lo ya mencionado.

REQUIREMENTS
------------
The following commands must be implemented, along with their parameters (see man help pages for information on each):

1. The "ls" command. Parameters that need to be implemented are: -l, -s, -a, -F

2. The "tac" command. Parameters that need to be implemented are: -b, -s

3. The "dirname" command. No parameters need to be implemented.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Programar una terminal en c

Publicado por Tom (610 intervenciones) el 25/03/2019 19:23:54
En el enunciado te dicen que debes implementar tú esos comandos. Y más adelante te "sugieren" que lo hagas con una rutina para cada uno.

"Scope: create a simple command line interpreter, able to interpret a set of internally-implemented commands"
"All commands will be implemented as external functions. A library of functions could be developed for this purpose"
"Each command will accept the main calling convention: int yourCommandFunction ..."

Total, es engorroso incluso sabiendo cómo hacerlo. Podrías presentar lo que tienes, pero estarías ejecutando "comandos" que estarían en el sistema, totalmente independientes de tu intérprete.
Por lo demás, si vas a seguir, simplemente guárdate en una lista y/o en un fichero (al estilo de history) cada comando (el texto que se introdujo por teclado) que hayas podido ejecutar sin errores.
En la parte en que lees el comando a ejecutar, prueba, pulsa en el teclado las flechas del cursor y mira a ver qué has leído para poder hacer el código que lo interprete. A partir de ahí, navega por la lista que tienes guardada y repite el comando.

Además, dependiendo del SO que uses, las "flechas" pueden generar códigos distintos en un desktop que en el terminal. Si quieres un cierto nivel de compatibilidad probablemente debas aprender a usar terminfo y/o termcap (en unix/linux).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de SuperIndio
Val: 47
Ha disminuido 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Programar una terminal en c

Publicado por SuperIndio (21 intervenciones) el 26/03/2019 15:15:09
Bueno no es tan dificil, una terminal usa protocolo TELNET,
el mismo esta montado sobre TCP/IP de manera que deberas usar socket
yo hice una en modo console, lo mas dificil es la interpretacion
de teclas especiales y el tratamiento del campo prioridad
lee sobre protocolo TELNET y busca un ejemplo de


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/signal.h>
#include <sys/errno.h>
 
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
 
#include <termios.h>
 
extern FILE     *scrfp;
extern char     scrname[];
extern struct termios   oldtty;
 
extern char     t_flushc, t_intrc, t_quitc, sg_erase, sg_kill;
 
extern int      errno;
 
int errexit(const char *format, ...), cerrexit(const char *format, ...);
int ttwrite(FILE *sfp, FILE *tfp, unsigned char *buf, int cc);
int sowrite(FILE *sfp, FILE *tfp, unsigned char *buf, int cc);
int fsmbuild(void);
 
void rcvurg(int);
 
#define BUFSIZE         2048
 
struct termios  oldtty;
 
int connectTCP(const char *host, const char *service);
int ttysetup(void);
 
int telnet(const char *host, const char *service) {
 
      int     s, nfds;
      u_char  buf[BUFSIZE];
      int     cc;
      int     on = 1;
      fd_set  arfds, awfds, rfds, wfds;
      FILE    *sfp;
 
      s = connectTCP(host, service);
 
      ttysetup();
      fsmbuild();
      (void) signal(SIGURG, rcvurg);
      (void) setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on));
 
      nfds = getdtablesize();
      FD_ZERO(&arfds);
      FD_ZERO(&awfds);
      FD_SET(s, &arfds);
      FD_SET(0, &arfds);
 
      sfp = fdopen(s, "w");
 
      while (1) {
              memcpy(&rfds, &arfds, sizeof(rfds));
              memcpy(&wfds, &awfds, sizeof(rfds));
 
              if (select(nfds, &rfds, &wfds, (fd_set *)0,
                              (struct timeval *)0) < 0) {
                      if (errno == EINTR)
                              continue;
                      cerrexit("select: %s\n", strerror(errno));
              }
              if (FD_ISSET(s, &rfds)) {
                      cc = read(s, (char *)buf, sizeof(buf));
                      if (cc < 0)
                              cerrexit("socket read: %s\n",
                                              strerror(errno));
                      else if (cc == 0) {
                              printf("\nconnection closed.\n");
                              if (tcsetattr(0, TCSADRAIN, &oldtty) < 0)
                                      errexit("tcsetattr: %s\n",
                                              strerror(errno));
                              exit(0);
                      } else
                              ttwrite(sfp, stdout, buf, cc);
              }
              if (FD_ISSET(0, &rfds)) {
                      cc = read(0, (char *)buf, sizeof(buf));
                      if (cc < 0)
                              cerrexit("tty read: %s\n",
                                              strerror(errno));
                      else if (cc == 0) {
                              FD_CLR(0, &arfds);
                              (void) shutdown(s, 1);
                      } else
                              sowrite(sfp, stdout, buf, cc);
              }
              (void) fflush(sfp);
              (void) fflush(stdout);
      }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Programar una terminal en c

Publicado por Jesus (7 intervenciones) el 26/03/2019 17:16:20
No entiendo muy bien lo que me has puesto, no se si debería saber realizarlo pero tengo hasta mayo para hacerlo y en mi universidad de origen nunca tocamos el lenguaje c, siempre en java por lo que no se ni por donde empezar. Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Programar una terminal en c

Publicado por Tom (610 intervenciones) el 26/03/2019 17:40:16
No se ha enterado tampoco de lo que se supone que debes hacer.
Por otra parte, no veo ningún impedimento para hacerlo en java (no creo haber leído nada sobre el lenguaje en el enunciado que has enlazado). Tu problema no creo que sea el desconocimiento de c, sino el de temas básicos del S.O. ( ¿qué es un terminal ? ¿ qué es un intérprete de comandos ? ¿ cómo se "lee del teclado" ? ¿ Qué es un comando ? ...)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Programar una terminal en c

Publicado por Jesus (7 intervenciones) el 26/03/2019 17:43:53
No niego que sea por desconocimiento de la parte de sistemas operativos ya que nunca la he cursado y al estar de Erasmus donde estoy, digamos que no enseñan mucho solo mandan realizar trabajos y si tienes dudas la respuesta es esta en google, por lo que no tengo ni idea. Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar