Repository 32bit  Forum
Repository 64bit  Wiki

[risolto] [c] problema con execlp

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

[risolto] [c] problema con execlp

Messaggioda marcelloma » dom nov 23, 2008 17:06

Ho un problema con questo programmino che dovrebbe funzionare in questo modo
si avvia passandogli una parola in inglese e lui apre il browser links all'url http://www.wordreference.com/enit/PAROLA
il problema e' che il browser links si avvia ma su una pagina vuota come se non prendesse il parametro
però printf("Executing: %s %s\n", _BROWSER_, param); stampa
link http://www.wordreference.com/enit/parola
quindi dovrebbe andare..sapete aiutarmi?
Codice: Seleziona tutto
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> /* execl() */
#define _BROWSER_ "links"
#define _URL_ "http://www.wordreference.com/enit/"

int main(int argc, char**argv)
{
  char* param;

  if (argc != 2)
    {
      printf("Syntax: wordref word-to-translate\n");
      return 1;
    }

  param=calloc(strlen(_URL_)+strlen(argv[1])+1, sizeof(char));
  if (!param)
    {
      fprintf(stderr, "Not enough memory!\n");
      return 1;
    }
 
  strcpy(param, _URL_);
  param=strcat(param, argv[1]);
  printf("Executing: %s %s\n", _BROWSER_, param);
 
  if (execlp(_BROWSER_, param, NULL) == -1)
    {
      fprintf(stderr, "Error: cannot execute program.\n");
      return 1;
    }
  return 0;
}
Ultima modifica di marcelloma il dom nov 23, 2008 19:30, modificato 1 volta in totale.
marcelloma
Linux 1.0
Linux 1.0
 
Messaggi: 80
Iscritto il: dom nov 23, 2008 17:01
Nome Cognome: Marcello
Slackware: 12.1
Kernel: 2.6.24.5-smp
Desktop: xfce

Re: [c] problema con execlp

Messaggioda Mario Vanoni » dom nov 23, 2008 17:26

marcelloma ha scritto:Ho un problema con questo programmino che dovrebbe funzionare in questo modo
si avvia passandogli una parola in inglese e lui apre il browser links all'url http://www.wordreference.com/enit/PAROLA
il problema e' che il browser links si avvia ma su una pagina vuota come se non prendesse il parametro
però printf("Executing: %s %s\n", _BROWSER_, param); stampa
link http://www.wordreference.com/enit/parola
quindi dovrebbe andare..sapete aiutarmi?
Codice: Seleziona tutto
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> /* execl() */
#define _BROWSER_ "links"
#define _URL_ "http://www.wordreference.com/enit/"

int main(int argc, char**argv)
{
  char* param;

  if (argc != 2)
    {
      printf("Syntax: wordref word-to-translate\n");
      return 1;
    }

  param=calloc(strlen(_URL_)+strlen(argv[1])+1, sizeof(char));
  if (!param)
    {
      fprintf(stderr, "Not enough memory!\n");
      return 1;
    }
 
  strcpy(param, _URL_);
  param=strcat(param, argv[1]);
  printf("Executing: %s %s\n", _BROWSER_, param);
 
  if (execlp(_BROWSER_, param, NULL) == -1)
    {
      fprintf(stderr, "Error: cannot execute program.\n");
      return 1;
    }
  return 0;
}


IMVHO mancano gli spazi:
vecchia regola AT&T UNIX
#define _BROWSER_ "links " /* con uno spazio */

strcat(param. argv[1]); /* manca uno spazio */

Gli argomenti devono essere separati da "white spaces".
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [c] problema con execlp

Messaggioda marcelloma » dom nov 23, 2008 17:47

Mario Vanoni ha scritto:IMVHO mancano gli spazi:
vecchia regola AT&T UNIX
#define _BROWSER_ "links " /* con uno spazio */

strcat(param. argv[1]); /* manca uno spazio */

Gli argomenti devono essere separati da "white spaces".


se metto uno spazio dopo links execvlp fallisce perche' non trova il programma
in strcat(param. argv[1]); perche' dici che manca uno spazio? lo scopo e' concatenare l'url con la parola in modo da formare
http://.../enit/parola
non sono 2 argomenti separati..deve diventare tutto un unico argomento
marcelloma
Linux 1.0
Linux 1.0
 
Messaggi: 80
Iscritto il: dom nov 23, 2008 17:01
Nome Cognome: Marcello
Slackware: 12.1
Kernel: 2.6.24.5-smp
Desktop: xfce

Re: [c] problema con execlp

Messaggioda Mario Vanoni » dom nov 23, 2008 18:34

marcelloma ha scritto:
Mario Vanoni ha scritto:IMVHO mancano gli spazi:
vecchia regola AT&T UNIX
#define _BROWSER_ "links " /* con uno spazio */

strcat(param. argv[1]); /* manca uno spazio */

Gli argomenti devono essere separati da "white spaces".


se metto uno spazio dopo links execvlp fallisce perche' non trova il programma
in strcat(param. argv[1]); perche' dici che manca uno spazio? lo scopo e' concatenare l'url con la parola in modo da formare
http://.../enit/parola
non sono 2 argomenti separati..deve diventare tutto un unico argomento


OK per strcat, pensavo un argomento dopo URL.

#define _BROWSER_ "/usr/bin/links " /* con uno spazio */
perche` execlp non necessariamente riconosce $PATH,
ogni programma UNIX deve essere separato
dal primo argomento con "white spaces"

Tu metti uno spazio nel printf("Executing: ...

Se provo da shell
links http://www.wordreference.com/enit/charles
funziona.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [c] problema con execlp

Messaggioda marcelloma » dom nov 23, 2008 18:48

Ho fatto come dici tu ma la funzione fallisce, se vedi nella documentazione

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg , ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);

execlp vuole il nome del file non il path, e anche mettendo il nome del file e poi uno spazio non funziona, lo so che da terminale funziona ma eseguendolo invece no..prova a compilarlo

Codice: Seleziona tutto
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> /* execl() */
#define _BROWSER_ "/usr/bin/links "
#define _URL_ "http://www.wordreference.com/enit/"

int main(int argc, char**argv)
{
  char* param;

  if (argc != 2)
    {
      printf("Syntax: wordref word-to-translate\n");
      return 1;
    }

  param=calloc(strlen(_URL_)+strlen(argv[1])+1, sizeof(char));
  if (!param)
    {
      fprintf(stderr, "Not enough memory!\n");
      return 1;
    }
 
  strcpy(param, _URL_);
  param=strcat(param, argv[1]);
  printf("Executing: %s %s\n", _BROWSER_, param);
 
  if (execlp(_BROWSER_, param, NULL) == -1)
    {
      fprintf(stderr, "Error: cannot execute program.\n");
      return 1;
    }
  return 0;
}
marcelloma
Linux 1.0
Linux 1.0
 
Messaggi: 80
Iscritto il: dom nov 23, 2008 17:01
Nome Cognome: Marcello
Slackware: 12.1
Kernel: 2.6.24.5-smp
Desktop: xfce

Re: [c] problema con execlp

Messaggioda Mario Vanoni » dom nov 23, 2008 18:54

marcelloma ha scritto:Ho fatto come dici tu ma la funzione fallisce, se vedi nella documentazione

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg , ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);

execlp vuole il nome del file non il path, e anche mettendo il nome del file e poi uno spazio non funziona, lo so che da terminale funziona ma eseguendolo invece no..prova a compilarlo

Codice: Seleziona tutto
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> /* execl() */
#define _BROWSER_ "/usr/bin/links "
#define _URL_ "http://www.wordreference.com/enit/"

int main(int argc, char**argv)
{
  char* param;

  if (argc != 2)
    {
      printf("Syntax: wordref word-to-translate\n");
      return 1;
    }

  param=calloc(strlen(_URL_)+strlen(argv[1])+1, sizeof(char));
  if (!param)
    {
      fprintf(stderr, "Not enough memory!\n");
      return 1;
    }
 
  strcpy(param, _URL_);
  param=strcat(param, argv[1]);
  printf("Executing: %s %s\n", _BROWSER_, param);
 
  if (execlp(_BROWSER_, param, NULL) == -1)
    {
      fprintf(stderr, "Error: cannot execute program.\n");
      return 1;
    }
  return 0;
}


Mandami a
vanonim@alice.it
il tuo file.c
lo provo.

PS Non sono ancora capace a copiarlo dal forum,
forse odio troppo le GUI, sic!
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [c] problema con execlp

Messaggioda targzeta » dom nov 23, 2008 19:24

Con riferimento all'ultimo programma che hai postato.
1) Nella define di _BROWSER_, va tolto l'ultimo carattere, ovvero lo spazio finale.

2) Dal man di execlp:
The const char *arg and subsequent ellipses in the execl(), execlp(), and execle() functions can be thought of as arg0, arg1, ..., argn. Together they describe a list of one or more pointers to null-terminated strings that represent the argument list available to the executed program. The first argument, by convention, should point to the filename associated with the file being executed. The list of arguments must be terminated by a NULL pointer, and, since these are variadic functions, this pointer must be cast (char *) NULL.

Quindi presumo che la corretta invocazione sia:
Codice: Seleziona tutto
if ( execlp(_BROWSER_, _BROWSER_, param, NULL) == -1)


Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6200
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [c] problema con execlp

Messaggioda marcelloma » dom nov 23, 2008 19:30

spina ha scritto:Con riferimento all'ultimo programma che hai postato.
1) Nella define di _BROWSER_, va tolto l'ultimo carattere, ovvero lo spazio finale.

2) Dal man di execlp:
The const char *arg and subsequent ellipses in the execl(), execlp(), and execle() functions can be thought of as arg0, arg1, ..., argn. Together they describe a list of one or more pointers to null-terminated strings that represent the argument list available to the executed program. The first argument, by convention, should point to the filename associated with the file being executed. The list of arguments must be terminated by a NULL pointer, and, since these are variadic functions, this pointer must be cast (char *) NULL.

Quindi presumo che la corretta invocazione sia:
Codice: Seleziona tutto
if ( execlp(_BROWSER_, _BROWSER_, param, NULL) == -1)


Spina


grazie! Adesso funziona
marcelloma
Linux 1.0
Linux 1.0
 
Messaggi: 80
Iscritto il: dom nov 23, 2008 17:01
Nome Cognome: Marcello
Slackware: 12.1
Kernel: 2.6.24.5-smp
Desktop: xfce

Re: [risolto] [c] problema con execlp

Messaggioda Mario Vanoni » dom nov 23, 2008 19:50

Confermo Emanuele che mi ha preceduto.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [risolto] [c] problema con execlp

Messaggioda marcelloma » lun nov 24, 2008 14:04

quindi e' un parametro fantoccio quello..
marcelloma
Linux 1.0
Linux 1.0
 
Messaggi: 80
Iscritto il: dom nov 23, 2008 17:01
Nome Cognome: Marcello
Slackware: 12.1
Kernel: 2.6.24.5-smp
Desktop: xfce

Re: [risolto] [c] problema con execlp

Messaggioda Mario Vanoni » lun nov 24, 2008 16:10

marcelloma ha scritto:quindi e' un parametro fantoccio quello..


NI, incuriosito ...

man execlp
int execlp(const char *file, const char *arg, ...):

la man page di AT&T SVR3.2 dice
int execlp(file, argv0, argv1, ..., argn, (char *) 0)
char *file, *argv0, *argv1, ..., *argvn;
e richiede
main (argc, argv, envp)
int argc;
char **argv, **envp;
{
extern char **environ;

Esperimenti interessanti nel tuo wordref.c:
execlp(_BROWSER_, param, ... si incanta
execlp(_BROSWER_, _BROWSER_, param, ... funziona
execlp("/bin/sh", _BROWSER_, param, ... mostra il tuo printf

Rileggendo ambedue i manuali,
GNU/Linux ha problemi con la sematica di execlp e execvp,
vedi anche man 2 execve,
non e` al 100% retro-compatibile con UNIX,
dovuto probabilmente a IEEE ed a POSIX.

Quintessenza per GNU/Linux:
usare lo stesso argomento per file ed arg0.

Infatti se aggiungi al tuo programma
printf("Environment: %s\n", *environ);
previa dichiarazione di
**envp nel main, vedi sopra, e di
extern char **environ;
di da una PATH inutile.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron