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

 

 


Tema destacado: Curso de javascript por TickTack


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

Desconectado Desconectado

Mensajes: 11


Ver Perfil
exec y sus derivadas
« en: 25 Octubre 2011, 19:34 pm »

Hola,

 S.O: linux
 Ansi-C
 
 Mi consulta es que he de ejecutar desde exec o una de sus derivadas (execlp, execle, ...) el comando cp para copiar un archivo a otro.
Lo he puesto de la siguiente manera:

Código:
int copy (char *src, char *dst)
{
 ret = execlp("/bin/cp", "cp", "/home/linux/ejercicio1", (char*)src,(char*)dst)
return 0;
}

 Desde la shell creo que seria cp origen.txt destino.txt  /home/linux/ejercicio1

Saludos


En línea

Foxy Rider


Desconectado Desconectado

Mensajes: 2.407


Deprecated


Ver Perfil WWW
Re: exec y sus derivadas
« Respuesta #1 en: 27 Octubre 2011, 06:56 am »

Correcto, peeeero... el formato de cp es

Código
  1. cp [origen] [destino]

así que el tercer argumento a  execlp está de más (no sé que habrás querido hacer), y el último argumento, sí o sí tiene que ser (char*) 0 (un puntero a char apuntando a 0, null )
lee esto (no tenés que leerlo completo, sólo lo que compete al ejercicio):

http://pubs.opengroup.org/onlinepubs/009695399/functions/execlp.html
http://pubs.opengroup.org/onlinepubs/009695399/utilities/cp.html

Saludos.


« Última modificación: 27 Octubre 2011, 06:58 am por vertex@Symphony » En línea

pucheto

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: exec y sus derivadas
« Respuesta #2 en: 27 Octubre 2011, 13:24 pm »

Y recorda que exec pisa tu proceso con la imagen del proceso que estas llamando. ( osea que nunca llegas a hacer el return de copy. ).
En línea

Valkyr


Desconectado Desconectado

Mensajes: 646


Divide y vencerás


Ver Perfil
Re: exec y sus derivadas
« Respuesta #3 en: 28 Octubre 2011, 01:12 am »

Y recorda que exec pisa tu proceso con la imagen del proceso que estas llamando. ( osea que nunca llegas a hacer el return de copy. ).
Es más, si es que se ejecutase cualquier cosa posterior al exec sería porque se ha producido algún error.
En línea

NewBe

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: exec y sus derivadas
« Respuesta #4 en: 29 Octubre 2011, 08:34 am »

Correcto, peeeero... el formato de cp es

Código
  1. cp [origen] [destino]

así que el tercer argumento a  execlp está de más (no sé que habrás querido hacer), y el último argumento, sí o sí tiene que ser (char*) 0 (un puntero a char apuntando a 0, null )
lee esto (no tenés que leerlo completo, sólo lo que compete al ejercicio):

http://pubs.opengroup.org/onlinepubs/009695399/functions/execlp.html
http://pubs.opengroup.org/onlinepubs/009695399/utilities/cp.html

Saludos.

He intentado hacer otra llamada exec fijandome en el ejemplo que me escribistes, pero me doy cuenta de que pueder ser que lo que yo prentendo hacer , como novato, no se puede. Es lo siguiente:

execlp("ls", "ls", filename, ">", otherfilename, NULL );

Saludos
En línea

Foxy Rider


Desconectado Desconectado

Mensajes: 2.407


Deprecated


Ver Perfil WWW
Re: exec y sus derivadas
« Respuesta #5 en: 1 Noviembre 2011, 00:06 am »

Y no es más fácil usar popen() para eso?

Saludos.

P.S: Nunca traté de usar pipes en una llamada a exec, pero desde ya me parece que sería inválido ... por que es algo que se implementa en las shells, digo ...
En línea

Foxy Rider


Desconectado Desconectado

Mensajes: 2.407


Deprecated


Ver Perfil WWW
Re: exec y sus derivadas
« Respuesta #6 en: 1 Noviembre 2011, 00:32 am »

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int argc, char **argv)
  5. {
  6.  FILE* pipeOutput = popen("ls /usr/home/vertex","r");
  7.  FILE* fileOutput = fopen("/usr/home/vertex/Salida.txt","w");
  8.  char fileBuffer[1024];
  9.  
  10.  if ( pipeOutput == 0 || fileOutput == 0)
  11.  {
  12.    printf("Failure opening input, output file or creating buffer\r\n");
  13.    exit(EXIT_FAILURE);
  14.  }
  15.  
  16.  
  17.  while(!feof(pipeOutput))
  18.  {
  19.    fgets(fileBuffer, sizeof(fileBuffer), pipeOutput);
  20.    fputs(fileBuffer, fileOutput);
  21.  }
  22.  
  23.  fclose(fileOutput);
  24.  pclose(pipeOutput);
  25.  
  26.  return EXIT_SUCCESS;
  27. }
  28.  
  29.  

Desde ya eso es un boceto de lo que tenes que hacer ... yo que vos reviso open(), read() y write(), fork(), pipe() y demás (chequeando errores también, por que esas funciones PUEDEN FALLAR) si querés escribirlo en un POSIX LIMPIO

Saludos.

P.S → Pista : http://www.etsimo.uniovi.es/cscene/CS4/CS4-06.html
« Última modificación: 2 Noviembre 2011, 03:05 am por [Alex] » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: exec y sus derivadas
« Respuesta #7 en: 2 Noviembre 2011, 01:39 am »

Si bien es un boceto (aquí voy de metiche) hay tres detalles en ese programa.

Si la dirección en memoria del array "fileBuffer" es igual a NULL el programa ya esta mas allá de la salvación (supongo estabas pensando en reservar memoria via malloc o similar).

Para salir de la función "main" no es necesaria la llamada a "exit", basta con utilizar la sentencia "return N;".

Por ultimo es mejor (salvo excepciones) evitar la función "feof" ya que esta retorna verdadero solo después que una función de lectura falla. En su lugar es mejor (si aplica) utilizar el valor de retorno de la función, en este caso "fgets":
Código
  1. while (fgets(fileBuffer, sizeof(fileBuffer), pipeOutput))
  2.   fputs(fileBuffer, fileOutput);

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Foxy Rider


Desconectado Desconectado

Mensajes: 2.407


Deprecated


Ver Perfil WWW
Re: exec y sus derivadas
« Respuesta #8 en: 2 Noviembre 2011, 03:05 am »

Citar
Si la dirección en memoria del array "fileBuffer" es igual a NULL el programa ya esta mas allá de la salvación (supongo estabas pensando en reservar memoria via malloc o similar).

Si, puse con malloc y al toque borré y dije  "no, al stack! más sencillo"
olvidé modificar el if después de eso, claramente x'D

Citar
Para salir de la función "main" no es necesaria la llamada a "exit", basta con utilizar la sentencia "return N;".

Gracias, ya sé que main es una función ... y sé sobre el tema "retornar códigoo de términación al sistema operativo" (sino no estarían los EXIT_* ... en vez de un return 0 por ejemplo)

Citar
Por ultimo es mejor (salvo excepciones) evitar la función "feof" ya que esta retorna verdadero solo después que una función de lectura falla. En su lugar es mejor (si aplica) utilizar el valor de retorno de la función, en este caso "fgets":

Dije que era un boceto, no una solución, quería mantenerlo chiquitito y evitar muchas cosas como if's (y chequear el valor de retorno incluye un if) ... sino directamente iba con escribirlo en POSIX limpio, pero esa es la tarea del autor (en el mensaje que postee el código me avivé que es una tarea y que el autor seguramente está aprendiendo POSIX y que TIENE QUE reescribirlo a un POSIX limpio)
La idea de postear un código era "dibujar" qué es lo que tiene que hacer (usar un pipe para pasar la salida de un comando a un fichero en vez de usar ">" como parámetro) a exec*

Si te toca mucho los sentimientos te mando la solución correcta por PM

Citar
Es más, si es que se ejecutase cualquier cosa posterior al exec sería porque se ha producido algún error.

Eso está en el link a la documentación del Open Group, si lo pongo (así como muchas veces en Unix y GNU/Linux me tomo el tiempo e insisto en enlazar manpages), *claramente* es para que lo lean, no voy a re-describir que hace exec acá.

Saludos.

P.S: no veo nada malo con feof, la idea era también quen si hay un error (cosa que un EOF también setea el bit), se interrumpa "el paso" de la salida al fichero ...

P.S 2 : Gracias por la observación, está bueno agregar un "por qué" a las cosas que uno hace (no iba a hacerlo a horas am)

P.S 3: Ahí cambié el if
« Última modificación: 2 Noviembre 2011, 03:12 am por [Alex] » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: exec y sus derivadas
« Respuesta #9 en: 2 Noviembre 2011, 04:46 am »

P.S: no veo nada malo con feof, la idea era también quen si hay un error (cosa que un EOF también setea el bit), se interrumpa "el paso" de la salida al fichero ...
El problema es, tal como se utiliza en el programa, el uso de "feof" es un error lógico. Eso porque usualmente se toma a esa función como ¿Hay mas caracteres que leer? cuando debería ser ¿Que paso con la ultima operación de lectura?

Dado el bucle:
Código
  1. while(!feof(pipeOutput))
  2. {
  3.   fgets(fileBuffer, sizeof(fileBuffer), pipeOutput);
  4.   fputs(fileBuffer, fileOutput);
  5. }
Supongamos que se leen todas las lineas menos la ultima, a partir de ese momento:

1) fgets lee la ultima linea, no hay problema.
2) fputs la imprime, ídem.
3) feof no retorna verdadero ya que la ultima operación de lectura fue exitosa.
4) lectura extra con fgets falla
5) escritura con fputs (no debería)
6) feof retorna verdadero y se termina el bucle.

Como puedes ver se realiza una iteracion de mas. Para evitarlo se tendría que modificar el bucle a:
Código
  1. fgets(fileBuffer, sizeof(fileBuffer), pipeOutput);
  2. while(!feof(pipeOutput))
  3. {
  4.   fputs(fileBuffer, fileOutput);
  5.   fgets(fileBuffer, sizeof(fileBuffer), pipeOutput);
  6. }
Desde mi punto de vista es demasiado trabajo (ademas de reducir la claridad del código) cuando, para empezar, basta con simplemente verificar el valor de retorno de "fgets".

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
por favor un programa que cacule limites y derivadas
Programación Visual Basic
al.exito 1 1,975 Último mensaje 1 Mayo 2007, 02:04 am
por ~~
AYUDA CON DERIVADAS E INTEGRALES!!!!
Programación Visual Basic
aSaC 2 2,866 Último mensaje 4 Junio 2009, 06:22 am
por xkiz ™
Problema de exec secuencial de archivos[C]
Programación C/C++
MrJava 0 1,480 Último mensaje 4 Abril 2013, 16:24 pm
por MrJava
Derivadas en c++
Programación C/C++
socram7 7 33,352 Último mensaje 30 Mayo 2013, 20:27 pm
por socram7
ncat --lua-exec qué módulos trae?
Dudas Generales
@XSStringManolo 0 1,715 Último mensaje 28 Febrero 2020, 22:37 pm
por @XSStringManolo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines