Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [C]Execv non funziona

  1. #1

    [C]Execv non funziona

    Ragazzi ciao a tutti ho un problema non riesco a capire come mai la execv non
    funziona, potreste darmi una mano? il codice di gestione di processi unix funziona tutto correttamente ma la execv non parte.....

    codice:
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    int main(int argc,char *argv[])
    {
    	int status,i,pid,t,value;
    	int vett[argc-1];
    	int v=0;
    	char h[64];
    	
    	if(argc < 4 || argc > 11)
    	{
    		printf("errore numero argomenti\n");
    		exit(-1);
    	}
    
    	for(i=1;i<argc;i++)
    	{
    		if((strtol(argv[i],NULL,0))<1 || ((strtol(argv[i],NULL,0))>4))
    		{printf("valore argomenti errato\n");
    		exit(-2);}
    	}
    	
    	for(i=1;i<argc;i++)
    	{
    		vett[v]=strtol(argv[i],NULL,0);
    		v++;
    	}
    	argc--;
    
    	for(i=0;i<argc;i++)
    	{	
    		if((pid=fork())==0)
    		{	
    		 	srand(time(NULL));
    			t = rand() % 5 + 1;
    			sleep(t);
             printf("Sono il processo figlio %d ho aspettato %d secondi e termino\n",getpid(),t);
    			exit(vett[i]);}
    		
    		
    		
    	}
    	
    	for(i=0;i<argc;i++)
    	{                   wait(&status);
    			    value=WEXITSTATUS(status)-1;
       		            vett[i]=value;
    	}
    		
    	
    		for(i=0;i<argc;i++)
    		{      
    			while(vett[i]>=0)	
    			{	if(vett[i]>0)
    				{	pid=fork();
    					if(pid==-1)
    					{perror("errore fork ");
    				 	exit(-1);}
    				 
    					if(pid==0)
                                     	{srand(time(NULL));
    			         	t = rand() % 5 + 1;
    			         	sleep(t);
               printf("Sono il processo figlio %d ho aspettato %d secondi e termino\n",getpid(),t);
    				 	exit(0);}
           				
    				
    
    				}
                        		
    				if(vett[i]==0)
    				{	pid=fork();
    				 	if(pid==-1)
    				 	{perror("errore fork ");
    				  	exit(-1);}
    				 
    				
    				 	if(pid==0)															
    					{	
    	                    sprintf(h,"Il processo figlio %d è terminato",getpid());					
    				        	execv("usr/bin/xmessage",h);
                			        	exit(-1);
    					}
    				 	
    				
    				
    				}
    		
    			wait(&status);
    			--vett[i];
    			}
    		}
    			
    		        
    printf("Sono il padre %d e termino perchè non è possibile creare altri processi\nin quanto il valore degli argomenti è:
                            \n",getpid());
    			for(i=0;i<argc;i++)
    			printf("%d ",vett[i]);
    			printf("\ne tutti i figli sono terminati\n");			
    			return 0;
    		
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    execv si aspetta un array di puntatori a char come secondo parametro (ciascuno dei quali deve corrispondere ai vari argomenti del comando da eseguire), l'ultimo dei quali deve essere NULL. Nel tuo caso forse ti conviene maggiormente usare una execl che richiede una semplice lista di argomenti i quali vanno elencati singolarmente separati da virgole, con NULL alla fine, quindi nel tuo caso sarebbe qualcosa come

    execl("/usr/bin/xmessage", "/usr/bin/xmessage", h, NULL);

    magari aggiungi un controllo di errore: se la funzione ti restituisce -1, stampa il valore descrittivo di errno con perror() o strerror() per capire cosa non va.
    every day above ground is a good one

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 © 2026 vBulletin Solutions, Inc. All rights reserved.