Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154

    [C] execv... problemini :)

    Ciao, Avrei un paio di domande
    Sul desktop (uso Mdk 10.1) ho un file eseguibile "a1.out" che quando lo lancio devo dare il comando "./a1.out 3".
    Ho scritto poi questo programma per provare execv:
    codice:
    #include <errno.h>       
    #include <stdlib.h>      
    #include <unistd.h>      
    #include <stdio.h>       
    #include <string.h>      
    
    main()
    {
    	int status, pid;
    
    	pid = fork();
    
    	if (pid == 0)
    	 	execv ("/home/andrea/Desktop/a1.out", "3");
    	else
    	{
    		waitpid(pid, &status);
    		printf("\nFinito processo maggiore\n");
    	}
    }
    ma in compilazione ho il seguente errore:
    codice:
    provaExec.c: In function `main':
    provaExec.c:14: warning: passing arg 2 of `execv' from incompatible pointer type
    Non riesco a capire cosa non vada (a1.out funziona correttamente se lanciato a parte).

    Inoltre compilando un file con:
    codice:
    cc nomeFile.c
    crea l'eseguibile "a.out". E' possibile dare il nome che si vuole all'eseguibile in fase di compilazione?
    Thx

  2. #2
    scusa quali sono i tipi di dati che prende come parametri la tua funzione execv? due stringhe?
    www.matteosteri.it

  3. #3
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154
    Gapil la riporta così:
    codice:
    int execv(const char *path, char *const argv[])
    Cosa indica la 2a dichiarazione char *const argv[]?

  4. #4
    leggi questo: http://www.lilik.it/~mirko/gapil/gapilsu42.html

    prova così:

    char *val[] = {"3", "\0"};

    /* poi */

    execv("percorso/file_eseguibile", val);

    /* */

    p.s. per compilare ed assegnare un nome non standard all'eseguibile:

    gcc nomesorgente.c -o nomeeseguibile.exe
    ...Terrible warlords, good warlords, and an english song

  5. #5
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154
    Così con val non mi dà più il warning, però il parametro che gli passa è 0 e non 3.

  6. #6
    codice:
    /* passa_val.c */
    
    #include <stdio.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[])
    {
        int status, pid;
    
        printf("PASSA_VAL.EXE\n\n");
    
        argv[0] = "3";
    
        pid = fork();
    
        if(pid == 0)
            execv("./prendi_val.exe", argv);
        else
            waitpid(pid, &status);
    
        return 0;
    }
    codice:
    /* prendi_val.c */
    
    #include <stdio.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[])
    {
        printf("PRENDI_VAL.EXE\n\n");
    
        printf("%s\n", argv[0]); /* <-- valore passato da passa_val.exe */
        
        return 0;
    }
    ...Terrible warlords, good warlords, and an english song

  7. #7
    Utente di HTML.it L'avatar di Alcott
    Registrato dal
    Jul 2003
    Messaggi
    154
    Sono riuscito a passare i valori... thx
    Mi si presenta un altro problema però!
    La mia funzione chiamata è quella di gapil in fig 4.3:
    codice:
    #include <stdlib.h>      /* C standard library */
    #include <unistd.h>      /* unix standard library */
    #include <stdio.h>       /* standard I/O library */
    #include <string.h>      /* string functions */
    
    /* Help printing routine */
    void usage(void);
    
    main(int argc, char *argv[])
    {
     /*
      * Variables definition
      */
         int nchild, i;
         pid_t pid1;
         int wait_child  = 0;
         int wait_parent = 0;
         int wait_end    = 0;
    
            /* handling options */
         nchild = atoi(argv[optind]);
         printf("Test for forking %d child\n", nchild);
         /* loop to fork children */
         for (i=0; i<nchild; i++)
         {
             if ( (pid1 = fork()) < 0)
    	 {
                 /* on error exit */
                 printf("Error on %d child creation, %s\n", i+1, strerror(errno));
                 exit(-1);
             }
             if (pid1 == 0)
    	 {   /* child */
                 printf("Child %d successfully executing\n", ++i);
                 if (wait_child) sleep(wait_child);
                 printf("Child %d, parent %d, exiting\n", i, getppid());
                 exit(0);
             } else
    	 	{          /* parent */
             	    printf("Spawned %d child, pid1 %d \n", i+1, pid1);
                 	if (wait_parent) sleep(wait_parent);
                	 printf("Go to next child \n");
            	}
         }
         /* normal exit */
         if (wait_end) sleep(wait_end);
         return 0;
     }
    mentre quella chiamante ve l'ho riportata su.
    Il problema è questo: come output, passando il valore per es. 2 ho a volte
    codice:
    Test for forking 2 child
    Child 1 successfully executing
    Child 1, parent 5953, exiting
    Spawned 1 child, pid1 5954
    Go to next child
    Child 2 successfully executing
    Child 2, parent 5953, exiting
    Spawned 2 child, pid1 5955
    Go to next child
    
    Finito processo maggiore
    (che sarebbe quello che vorrei ottenere), altre volte invece non mi aspetta la fine del filgio e dei "nipoti" e mi dà
    codice:
    Test for forking 2 child
    Child 1 successfully executing
    Child 1, parent 5957, exiting
    Spawned 1 child, pid1 5958
    Go to next child
    
    Finito processo maggiore
    [andrea@localhost Desktop]$ Child 2 successfully executing
    Child 2, parent 5957, exiting
    Spawned 2 child, pid1 5959
    Go to next child
    Sapete come mai?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.