Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-09-2008, 21:04   #1
lodoss08
Junior Member
 
Iscritto dal: Jul 2008
Messaggi: 6
[C] problemi con clone()

Ciao a tutti!
Sto facendo delle prove di programmazione in C, ma ho dei problemi che non so come risolvere. Ecco il testo ed il codice:
Codice:
/*
Il processo padre apre due file in lettura/scrittura (i nomi dei file sono passati sulla riga di comando) e crea due processi clone passando come parametro ad ognuno di essi uno dei file descriptor dei file aperti in precedenza nonchè il byte da scrivere ripetutamente nel file. 

Ognuno dei due clone esegue un ciclo senza fine aspettando un segnale SIGUSR1 dal processo padre. 

Quando riceve tale segnale, il clone scrive 10 byte nel file di sua competenza (il tipo di byte che il clone deve scrivere ed il file descriptor sono passati come parametri della clone() dal processo padre) e si mette in attesa del prossimo segnale. 

Dopo avere creato i due cloni, il processo padre esegue un ciclo per 10 volte consecutive in cui: 

1)calcola con probabilità 1/2 il pid del clone al quale inviare un segnale SIGUSR1 

2)invia al clone avente il pid calcolato in precedenza il segnale SIGUSR1 

3)aspetta 200 msec 

I nomi dei file da creare e i due caratteri che i cloni dovranno scrivere sono passati sulla riga di comando. 

Esempio di riga di comando: prova ./file1 ./file2 a b 
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sched.h>
#include <time.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/wait.h>

#define NPROC 2
#define STACK_SIZE 4096

struct argomenti
{
	int fd;
	char *byte;
};

void handler(int sign)
{
	printf("handler attivato da %d\n", getpid());
	
	return;
}

int cloneFunc(void *args)
{
	signal(SIGUSR1, handler);
	
	int fd = ((struct argomenti *) args)->fd;
	char *byte = ((struct argomenti *) args)->byte;
	
	printf("Creato processo %d, con fd %d e byte %s\n", getpid(), fd, byte);
	
	for ( ; ; )
	{
		pause();
		
		int j;
		for (j = 0; j < 10; j++)
		{
			if (write(fd, byte, 1) < 0)
			{
				printf("Errore in stampa\n");
			}
		}
	
		printf("%d ha eseguito una stampa\n", getpid());
	}
	
	exit(1);
	
	return 1;
}

int main(int argc, char *argv[])
{	
	if (argc != 5)
	{
		printf("Errore nel numero di parametri\nUso: scriviByte2File filename1 filename2 byte1 byte2\n");
		exit(-1);
	}
	
	int i;
	
	struct argomenti *args;
	void *childStack;
	int pid[2];
	int fds[2];
	
	for (i = 0; i < NPROC; i++)
	{	
		if ((fds[i] = creat(argv[i + 1], S_IRWXU | S_IRWXG | S_IRWXO)) < 0)
		{
			printf("Impossibile creare %s, forse già esiste\n", argv[i + 1]);
			exit(-1);
		}
		
		args = calloc(1, sizeof(struct argomenti));
		
		args->fd = fds[i];
		args->byte = (char *) argv[i + 3];
		
		childStack = calloc(1, STACK_SIZE);				
		
		if ((pid[i] = clone(cloneFunc, childStack, CLONE_FILES, (void *) args)) < 0)
		{
			printf("Errore in clone()\n");
			exit(-1);
		}
		
	}
	
	for (i = 0; i < 10; i++)
	{
		srand(time(NULL));
		int prob = rand() % 2;
		
		kill(pid[prob], SIGUSR1);
		printf("Inviato SIGUSR1 a %d\n", pid[prob]);
		
		usleep(200000);
	}	
	
	for (i = 0; i < NPROC; i++)
	{
		if (kill(pid[i], SIGKILL) < 0)
			printf("Errore in kill %d\n", pid[i]);
			
		//if (close(fds[i]) < 0)
		//	printf("Errore in close %d\n", fds[i]);
	}
	
	exit(1);
}
ora, il secondo processo non riesce a scrivere sul file, perchè, mentre nel main il suo fd è, per esempio, 4, nella funzione cloneFunc viene letto come 134524960... Non capisco perchè! e poi la close alla fine del main l'ho dovuta commentare perchè altrimenti dopo la creazione dei file non avviene nessuna scrittura. Qualcuno ha idea di dove sia il mio errore?
lodoss08 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
'Robot abbastanza forti da fratturare un...
Anche DAZN ha il suo Black Friday: 40 eu...
Carmageddon: Rogue Shift, il prossimo ca...
Redal Alert 2: Command & Conquer si ...
Kingston Technology: memorie e storage c...
Narwal Freo Z10 Ultra: il robot con moci...
In 3 minuti le vedete tutte: sono le mig...
Black Friday da record per Tineco: le sc...
La nuova PS5 con Fortnite manda in tilt ...
Amazon, i tagli hanno colpito soprattutt...
Pazzesco: Panasonic Lumix DC-GH5M2E a 79...
Ecco tutte le offerte Black Friday pi&ug...
DJI Neo a 169€, Flip Combo a 309€ e molt...
Quattro persone arrestate negli USA per ...
Kindle Paperwhite Signature Edition, Col...
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: 16:41.


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