Pagina 1 di 1

[risolto] [c] problema con execlp

Inviato: dom 23 nov 2008, 17:06
da marcelloma
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;
}

Re: [c] problema con execlp

Inviato: dom 23 nov 2008, 17:26
da Mario Vanoni
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".

Re: [c] problema con execlp

Inviato: dom 23 nov 2008, 17:47
da marcelloma
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

Re: [c] problema con execlp

Inviato: dom 23 nov 2008, 18:34
da Mario Vanoni
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.

Re: [c] problema con execlp

Inviato: dom 23 nov 2008, 18:48
da marcelloma
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;
}

Re: [c] problema con execlp

Inviato: dom 23 nov 2008, 18:54
da Mario Vanoni
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!

Re: [c] problema con execlp

Inviato: dom 23 nov 2008, 19:24
da targzeta
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

Re: [c] problema con execlp

Inviato: dom 23 nov 2008, 19:30
da marcelloma
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

Re: [risolto] [c] problema con execlp

Inviato: dom 23 nov 2008, 19:50
da Mario Vanoni
Confermo Emanuele che mi ha preceduto.

Re: [risolto] [c] problema con execlp

Inviato: lun 24 nov 2008, 14:04
da marcelloma
quindi e' un parametro fantoccio quello..

Re: [risolto] [c] problema con execlp

Inviato: lun 24 nov 2008, 16:10
da Mario Vanoni
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.