elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 22:24  


Tema destacado: Nueva página de elhacker.net en Google+ Google+

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

Desconectado Desconectado

Mensajes: 10


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

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
vertexSymphony


Desconectado Desconectado

Mensajes: 2.156



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

Correcto, peeeero... el formato de cp es

Código
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 por vertex@Symphony » En línea

Mail/PGP/XMPP/D*
Código
gpg --recv-keys --keyserver pgp.mit.edu 0xCD21671D
pucheto

Desconectado Desconectado

Mensajes: 214


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

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: 632


Divide y vencerás


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

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: 10


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

Correcto, peeeero... el formato de cp es

Código
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
vertexSymphony


Desconectado Desconectado

Mensajes: 2.156



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

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

Mail/PGP/XMPP/D*
Código
gpg --recv-keys --keyserver pgp.mit.edu 0xCD21671D
vertexSymphony


Desconectado Desconectado

Mensajes: 2.156



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

Código
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char **argv)
{
 FILE* pipeOutput = popen("ls /usr/home/vertex","r");
 FILE* fileOutput = fopen("/usr/home/vertex/Salida.txt","w");
 char fileBuffer[1024];
 
 if ( pipeOutput == 0 || fileOutput == 0)
 {
   printf("Failure opening input, output file or creating buffer\r\n");
   exit(EXIT_FAILURE);
 }
 
 
 while(!feof(pipeOutput))
 {
   fgets(fileBuffer, sizeof(fileBuffer), pipeOutput);
   fputs(fileBuffer, fileOutput);
 }
 
 fclose(fileOutput);
 pclose(pipeOutput);
 
 return EXIT_SUCCESS;
}
 
 

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 por [Alex] » En línea

Mail/PGP/XMPP/D*
Código
gpg --recv-keys --keyserver pgp.mit.edu 0xCD21671D
rir3760


Desconectado Desconectado

Mensajes: 382


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

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
while (fgets(fileBuffer, sizeof(fileBuffer), pipeOutput))
  fputs(fileBuffer, fileOutput);

Un saludo
En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
vertexSymphony


Desconectado Desconectado

Mensajes: 2.156



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

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 por [Alex] » En línea

Mail/PGP/XMPP/D*
Código
gpg --recv-keys --keyserver pgp.mit.edu 0xCD21671D
rir3760


Desconectado Desconectado

Mensajes: 382


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

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
while(!feof(pipeOutput))
{
  fgets(fileBuffer, sizeof(fileBuffer), pipeOutput);
  fputs(fileBuffer, fileOutput);
}
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
fgets(fileBuffer, sizeof(fileBuffer), pipeOutput);
while(!feof(pipeOutput))
{
  fputs(fileBuffer, fileOutput);
  fgets(fileBuffer, sizeof(fileBuffer), pipeOutput);
}
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

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
vertexSymphony


Desconectado Desconectado

Mensajes: 2.156



Ver Perfil WWW
Re: exec y sus derivadas
« Respuesta #10 en: 2 Noviembre 2011, 06:27 »

Claro!
No me avive del residuo que quedaba por que lisa y llanamente ni lo compilé x') [PS2]
Entonces es mejor replantear el while a lo que pusiste vos, achicandolo y dejando nada mas que verifique si fgets da null

Gracias por hacerlo notar!

Saludos.

P.S: No escribo más algo relacionado con programación a horas AM, claramente es para problemas ... mis chequeos de qué escribo son MUCHO más laxos x'D (la última vez por un typo rm-rf'ee un arbol de directorios erroneo xP)
P.S 2: Toda mi vida usé feof() y nunca tuve un comportamiento raro (de hecho el libro que leí de C *hace añares* ponía un ejemplo así para leer un fichero y eventualmente por costumbre usaba feof - hasta que pasé a C++ y este asunto estaba "abstraído" -), aunque claro, usaba otro sistema y compilador y nunca pisé el "bug" del código ...
En línea

Mail/PGP/XMPP/D*
Código
gpg --recv-keys --keyserver pgp.mit.edu 0xCD21671D
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Codigo fuente para hallar derivadas parciales en Delphi
Programación General
nemesis666 0 1,649 Último mensaje 2 Agosto 2004, 05:16
por nemesis666
Parametros en exec!
Programación C/C++
The Jackal 5 1,236 Último mensaje 17 Marzo 2007, 01:38
por The Jackal
por favor un programa que cacule limites y derivadas
Programación Visual Basic
al.exito 1 326 Último mensaje 1 Mayo 2007, 02:04
por ~~
AYUDA CON DERIVADAS E INTEGRALES!!!!
Programación Visual Basic
aSaC 2 750 Último mensaje 4 Junio 2009, 06:22
por xkiz ™
Integrales, derivadas...
Foro Libre
AxXioma 10 2,767 Último mensaje 3 Julio 2009, 15:03
por ‭‭‭‭jackl007
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines