elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda minishell
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda minishell  (Leído 2,168 veces)
RADIACTIVO

Desconectado Desconectado

Mensajes: 20


syscall


Ver Perfil
Duda minishell
« en: 3 Abril 2014, 20:34 pm »

         Hola buenas, estoy programando una minishell para ir probando con esto de c. Estoy programando en debian con gcc 4.4 .
El comando que estoy intentando emular es grep "model name" < <input_file> .
         El caso es que no consigo hacerlo bien. No tiene mucho misterio, pero creo que me hago un lío con la función dup2(). Creo que no redirecciono bien las salidas, pero por mas que leo en internet no entiendo porque esta mal.

         Les dejo solo un main() con la función. Antes de meterlo en la minishell, programo los comandos en "módulos" diferentes hasta que funcionan debidamente.

         Gracias de antemano, cualquier ayuda es bien recibida. Saludos


Código:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int pid=0;
int sys_call_response=0;
int my_pipe[2];
int fd=0;


int main()
{
        char input_file[20];
        scanf("%s", input_file);
        fd =open(input_file, O_CREAT | O_RDWR, 0666);
        char *arguments[3] = {"grep","model name",NULL};
        pid = fork();

        if(pid==0)
        {
                dup2(fd,1);
                sys_call_response = execvp(arguments[0], arguments);
                exit(0);
        }

        else wait(NULL);
        return 0;
}


En línea

La ignorancia es la noche de la mente, solo que sin estrellas ni luna que alumbre.
SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Duda minishell
« Respuesta #1 en: 4 Abril 2014, 00:53 am »

Hola.

Por lo que leo intentas hacer algo como grep "[regexp]" < [fichero_de_texto], pero con grep no hace falta poner el '<', simplemente:
grep grep "[regexp]"  [fichero_de_texto]
Por ejemplo:
grep "asdasd" fich1 ==> ok
grep "asdasd" < fich1 ==> no ok

Además, cuando haces dup2(), esta función devuelve un nuevo descriptor de fichero, y deberías cerrar el antiguo, me explico:

Código:
    int fd=creat(fichName,0644);
    //Creamos un descriptor para el fichero (el mas bajo disponible
    //como no he cerrado ninguno, sería el 3 en principio).
    int nuevoFd=dup2(fd,1);
    //Duplico el descriptor 'fd' para asignárselo al descriptor 1 (stdout)
    //de tal manera que la salida estándar ha pasado a ser el fichero en
    //cuestión.
    close(fd);
    //Ya no necesito el antiguo descriptor, cierro.

Si no cierras el otro, creo que tendras el mismo descriptor apuntando a dos sitios a la vez.

Por otro lado, al crear el proceso hijo luego haces solo un if() para ver si es el hijo, pero el proceso padre debe esperar a que acabe el hijo. Así:
Código:
int n=fork();
switch(n){
case -1:
cerr<<"ERROR"<<endl;
break;
case 0:
//soy el proceso hijo, ahora voy a hacer mis cosas...
break;
default:
                       //soy el proceso padre, voy a esperar a mi hijo:
wait(NULL);
break;
}

Saludos.

PD. yo he tenido que hacer una práctica de crear un minishell, la tengo y está bastante documentada (el código con explicaciones y tal), si la quieres pídela.


« Última modificación: 4 Abril 2014, 01:03 am por SARGE553413 » En línea

RADIACTIVO

Desconectado Desconectado

Mensajes: 20


syscall


Ver Perfil
Re: Duda minishell
« Respuesta #2 en: 4 Abril 2014, 15:27 pm »

Muchas gracias  SARGE553413, me han venido muy bien tus consejos. ;D
Finalmente he resuetlo mi problema. A pesar de los errores que me has comentado, me he dado cuenta que era lo que no entendia.
Solo habia que redirigir la entrada estandar.

Código:
dup2(fd,0);

Siento las molestias y agradezco la ayuda.
Saludos
En línea

La ignorancia es la noche de la mente, solo que sin estrellas ni luna que alumbre.
xaps

Desconectado Desconectado

Mensajes: 157



Ver Perfil
Re: Duda minishell
« Respuesta #3 en: 4 Abril 2014, 18:54 pm »

No sería mejor recibir los parámetros desde el argv? Es decir, tu puedes crear una declaración de este tipo:
Código
  1. int main(int argc, char* argv[])
  2. {
  3.  ...
  4. }
  5.  
Entonces, si tu aplicación es app.exe, cuando hagas desde consola (Linux en este caso) "./a.exe parametro1 parametro2", argc será 3 (argument counter) y argv será {"a.exe", "parametro1", "parametro2"}, de manera que no tendrás que preocuparte por leer los datos.
En línea

"The programmers of tomorrow are the wizards of the future" - Gave Newel
RADIACTIVO

Desconectado Desconectado

Mensajes: 20


syscall


Ver Perfil
Re: Duda minishell
« Respuesta #4 en: 6 Abril 2014, 10:16 am »

   Si eso ya lo habia probado y efectivamente funciona. Pero es mas divertido hacer esas cosas manualmente, por lo menos para aprender.  ;D
  Estoy pensando en subir el codigo de la shell cuando acabe a ver que les parece, y asi me podrian dar ideas, consejos y cosas para sguir mejorando.
  Gracias otra vez! Saludos
En línea

La ignorancia es la noche de la mente, solo que sin estrellas ni luna que alumbre.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pequeña duda con un comando batch (NUEVA DUDA RELACIONADA)
Scripting
revenge1252 9 9,775 Último mensaje 13 Febrero 2008, 21:41 pm
por revenge1252
PRoblema MInishell
Programación C/C++
antonazo211 2 4,587 Último mensaje 22 Noviembre 2011, 23:08 pm
por n3w
Duda facil, [VIDEO QUE EXPLICA MI DUDA]
Diseño Gráfico
Ngeooz 6 8,893 Último mensaje 2 Diciembre 2013, 19:33 pm
por Ngeooz
[DUDA] Cambiar letra de unidad a archivo con un Batch [DUDA] « 1 2 »
Windows
MrMaticool 10 11,367 Último mensaje 12 Febrero 2014, 17:55 pm
por MrMaticool
Programación de Minishell
Programación C/C++
depresion100 2 1,721 Último mensaje 16 Abril 2016, 16:09 pm
por HardForo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines