Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
HONOR Magic V6 è arrivato in Italia a 2.299,90 euro con una promessa precisa: unire 4 mm di spessore da aperto (8,75 mm chiuso nel modello White, 9 mm negli altri colori) a una batteria da 6.660 mAh, la più capiente mai vista su un pieghevole. Lo abbiamo usato per oltre una settimana in versione Red 16/512 GB per capire se lo Snapdragon 8 Elite Gen 5 tiene testa alla concorrenza anche fuori dai benchmark ufficiali
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
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


Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere? Recensione HONOR Magic V6: spessore record e sup...
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Nuove funzionalità per Network Se...
FIAT Grizzly e Grizzly Fastback: ecco i ...
Dreame Aqua10 Ultra Roller Complete, il ...
Un microscopio a diamante trova in un mi...
Vexilar W15, il robot aspirapolvere con ...
Lombardia, i cittadini si ribellano ai d...
Einstein aveva ragione anche in chimica:...
Wi‑Fi lento e zone morte in casa? ...
L'IA continua a riempire le casse di TSM...
Clamoroso Ubisoft: il vecchio Assassin's...
Non serve aprire il cranio per le interf...
Sedie da ufficio in offerta: un modello ...
Christopher Nolan dice la sua sull'IA al...
Compra un Apple-1 nel 1976 e lo dimentic...
DOOM sul Casio Loopy, la console giappon...
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: 09:51.


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