Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
OPPO Reno14 F 5G si propone come smartphone di fascia media con caratteristiche equilibrate. Il device monta processore Qualcomm Snapdragon 6 Gen 1, display AMOLED da 6,57 pollici a 120Hz, tripla fotocamera posteriore con sensore principale da 50MP e generosa batteria da 6000mAh con ricarica rapida a 45W. Si posiziona come alternativa accessibile nella gamma Reno14, proponendo un design curato e tutto quello che serve per un uso senza troppe preoccupazioni.
Destiny Rising: quando un gioco mobile supera il gioco originale
Destiny Rising: quando un gioco mobile supera il gioco originale
Tra il declino di Destiny 2 e la crisi di Bungie, il nuovo titolo mobile sviluppato da NetEase sorprende per profondità e varietà. Rising offre ciò che il live service di Bungie non riesce più a garantire, riportando i giocatori in un universo coerente. Un confronto che mette in luce i limiti tecnici e strategici dello studio di Bellevue
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo
Plaud Note Pro è un registratore digitale elegante e tascabile con app integrata che semplifica trascrizioni e riepiloghi, offre funzioni avanzate come template e note intelligenti, ma resta vincolato a un piano a pagamento per chi ne fa un uso intensivo
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-07-2009, 08:00   #1
kily2001
Junior Member
 
Iscritto dal: Jun 2006
Messaggi: 2
[C] Problemi con fork+exec & segnali

ciao a tutti,

ho un problema in questi 2 programmi.

prog1.c:
Codice PHP:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>

#define fifo1 "/tmp/fifo1"

static void signal_handler(int sign)
{
    if(
sign==SIGCHLD){
        
pid_t status;
        
wait(&status);
    }
}

int main (void)
{

    
char cmd[256],buf[256];
    
int risp,pid,fd;

    
struct sigaction new_handlerold_handler;

    
new_handler.sa_handler signal_handler;
    
sigemptyset (&new_handler.sa_mask);
    
new_handler.sa_flags 0;

    
sigaction(SIGCHLD,&new_handler, &old_handler);

    while(
1) {
            
printf("insert command: ");
            
fgets(cmd,sizeof(cmd),stdin);
                
            
cmd[strlen(cmd)-1]='\0';
            
            if(
strcmp(cmd,"start")==0){

                if( (
pid=fork())<)
                    
printf("[fork()]: errore\n");
                else 
                    if(
pid==0){//codice del figlio
                        
pid_t pid=getpid();
                        
execlp("./prog2","prog2",(char*)0);//chiamo prog2
                    
}
                        
                    else if(
pid>0){//codice del padre    
                        
fd=open(fifo1,O_RDONLY);
                        
read(fd,&buf,sizeof(buf));
                        
close(fd);//leggo dalla FIFO
                        
                        
printf("%s\n",buf);//scrivo risultato                
                    
}        
            }
            else{
                if (
strcmp(cmd,"stop")==0){
                    
kill(pid,SIGUSR1);
                }
                else {
                    
printf("[%s]: comando errato\n"cmd);
                }
            }
    }

prog1.c presenta un prompt all'utente: se viene digitato start viene creato un figlio con fork() e viene eseguito il programma prog2 il cui file sorgente è prog2.c, se viene digitato stop viene mandato SIGUSR1 a prog2 (per terminare) e se il comando è errato stampa l'errore. Il ciclo continua all'infinito.
I 2 processi comunicano tramite una FIFO, in pratica prog1 stampa una stringa comunicata da prog2.

prog2.c
Codice PHP:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>
#include <malloc.h>

#define fifo1 "/tmp/fifo1"

static void signal_handler(int sign)
{
    
unlink(fifo1);
    exit(
0);
}

int main(void)
{
    
int x=0;
    
char buf[]="prog2 avviato";
    
int fdrisp;

    
struct sigaction new_handlerold_handler;

    
new_handler.sa_handler signal_handler;
    
sigemptyset (&new_handler.sa_mask);
    
new_handler.sa_flags 0;

    
sigaction(SIGUSR1,&new_handler, &old_handler);//se ricevo SIGUSR1 termino e cancello la fifo

    
mkfifo(fifo1,0777);

    
fd=open(fifo1,O_WRONLY);
    
write(fd,&buf,sizeof(buf));
    
close(fd);

    while(
1){ //continua all'infinito
        
x++;
    }

se prog2 riceve SIGUSR1 cancella la FIFO e ritorna.

Il mio problema è che vengono dduplicati in comandi: ad esempio, digito stop e invece di tornare al prompt riesegue il comando stop (o meglio, stampa errore poichè viene troncata l'ultima lettera).

Come posso fare?

grazie mille
kily2001 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
Destiny Rising: quando un gioco mobile supera il gioco originale Destiny Rising: quando un gioco mobile supera il...
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo Plaud Note Pro convince per qualità e int...
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy? Google Pixel 10 è compatto e ha uno zoom ...
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Osservata esplosione di raggi gamma (GRB...
Sean Duffy (amministratore ad interim de...
Renault lancia la super promo: porte ape...
Il tuo portatile ASUS ROG non funziona c...
Zoom migliora il suo operatore virtuale ...
Traguardo Omoda & Jaecoo in Italia: ...
EHT mostra nuove immagini di come cambia...
Il gioiellino di Fastned: aperti in Belg...
La nuova mini workstation AI di MinisFor...
Formula 1 2026, nuove gare Sprint in cal...
MacBook Pro con display OLED e supporto ...
Poste Italiane: dati di milioni di utent...
Microsoft blocca RaccoonO365, rubate olt...
15 anni dopo Skate 3, il gioco torna sot...
Molte novità per MongoDB: version...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:31.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v