Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Amazon porta i colori sul suo Kindle da scrittura più grande: schermo Colorsoft a 11 pollici, processore quad-core, penna premium più reattiva e strumenti IA per le note, sono le note salienti. Il salto di prezzo rispetto al modello in bianco e nero si fa sentire, anche se la percezione è quella di trovarsi di fronte a un prodotto di fascia altissima, per veri appassionati
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint
Abbiamo intervistato Sumit Dhawan, CEO di Proofpoint, per capire come stia cambiando il mondo della sicurezza con l'avvento dell'intelligenza artificiale e con il ritmo sempre più serrato a cui vengono trovate vulnerabilità nel software. Un problema significativo, che richiederà del tempo per essere risolto (o quantomeno arginato)
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
La parola d'ordine al Nextcloud Summit 2026, che si è tenuto a Monaco, è stata "sovranità". Non come è spesso usato questo termine in politica ma, al contrario, come capacità positiva di decidere il proprio destino tecnologico, con modalità collaborative e aperte. L'Europa dice già molto nel mondo open source, che viene visto come mezzo per ottenere la tanto agognata autonomia digitale
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-04-2004, 13:42   #1
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
[C] - signal e wait

Continuo a rompere le scatole sull'IPC

Supponiamo di avere un processo padre P che genera 2 gruppi di processi figli logicamente diversi, diciamo gruppo f1 e f2.

Se a un certo punto P riceve un segnale USR1 deve:
1)Inviare un segnale di terminazione ai processi del gruppo f1 e ASPETTARE che terminino...
2)Inviare un segnale di terminazione immediata ai processi del gruppo f2.

Inizialmente avevo pensato di usare due array che tenessero traccia del pid dei due gruppi.

Ma, almeno per il gruppo f2 non è detto che esistano dei processi (potrbbero esser già terminati).

Possono venirmi utile la syscall setpgid e getpgid ??
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2004, 13:58   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Mi sembra sensato.
Ti consiglio di gestire i due gruppi di processi da due processi leader di gruppo (v. man setsid)
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2004, 14:20   #3
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
Stavo pensando al primo gruppo di processi figli... devo necessariamente usare un vettore, perchè dovrà esserci una sequenza di

kill (f1)
wait(f1)
...
kill (fn)
wait(fn)


Non posso mandare una kill a tutti e poi una wait per tutti!Perciò poi avendo terminato tutti gli fi, potrei lanciare una
kill(0) che mi ucciderebbe immediatamente tutti i restanti eventuali processi figli (che hanno lo stesso group id del padre!)

fila?
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2004, 14:33   #4
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Io articolerei il problema in questo modo:

- Per ogni program group crei un leader. Questo leader tiene un contatore di quanti processi sono aggiunti al gruppo.
- Ogni volta che crei un processo, questo si deve spostare sul corretto gruppo di appartenenza, e manda un segnale (ad es. SIGURS1) al group leader. Il group leader, in corrispondenza di un SIGUSR1, incrementa il contatore dei processi.
- Quando devi terminare i processi di un certo gruppo, mandi un segnale (ad es. SIGQUIT) a tutti i processi del gruppo, tramite killpg. Questo segnale deve essere ignorato dal group leader, e intercettato dagli altri processi. Ogni volta che un processo muore, prima di morire manda un segnale (ad es. SIGUSR2) al group leader (non so se cambiando gruppo, la morte di un processo generi automaticamente un SIGCHLD al group leader -- non ho mai provato, ma dovrebbe essere così).
- Il group leader intercetta i SIGUSR2 (o SIGCHLD, se funziona come penso) e decrementa il contatore dei processi
- Quando il contatore dei processi arriva a 0, notifica con un segnale al processo padre che tutti i processi del gruppo sono terminati.

E' solo una via, potresti pensare altre soluzioni.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12

Ultima modifica di ilsensine : 08-04-2004 alle 14:37.
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2004, 14:50   #5
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
Allora, vediamo di spiegare meglio il problema: il primo gruppo di processi è composto da un numero n noto a priori. Tutti gli n processi di qusto gruppo vivono dall'inizio alla fine della vita del padre.
Prima di morire il padre deve killarli (attendendo la loro terminazione).
POI deve killare eventuali altri processi servi (appartenenti al gruppo 2) senza attenderne la terminazione.

Il discorso dei leader di gruppo è interessante, ma non credo debba rientrare nella soluzione di questo progettino, non essendo stato tema di studio.
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2004, 14:55   #6
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da cn73
Allora, vediamo di spiegare meglio il problema: il primo gruppo di processi è composto da un numero n noto a priori. Tutti gli n processi di qusto gruppo vivono dall'inizio alla fine della vita del padre.
Prima di morire il padre deve killarli (attendendo la loro terminazione).
Questo puoi farlo semplicemente tramite un contatore di processi come ti dicevo. Tieni conto che quando un figlio muore, un SIGCHLD viene inviato al padre (il mio dubbio riguardava il group leader). Questo segnale è normalmente ignorato, puoi intercettarlo per decrementare il contatore di processi ancora "vivi". Quindi non devi far altro che aspettare che arrivi a 0.
Quote:
POI deve killare eventuali altri processi servi (appartenenti al gruppo 2) senza attenderne la terminazione.
Se per "altri" intendi "tutti", killpg fa al caso tuo. Altrimenti devi per forza tenere un array dei processi da terminare.
Quote:
Il discorso dei leader di gruppo è interessante, ma non credo debba rientrare nella soluzione di questo progettino, non essendo stato tema di studio.
Non credo che possa esistere un gruppo di processi senza un leader...forse mi sbaglio, ma mi sembra una pessima idea.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2004, 15:01   #7
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
Il fatto è che sono tutti figli! Praticamente i primi n processi figli sono lanciati all'inizio e poi possono richiedere al Padre un servizio, e questo si forcherà per fornirglielo... Quindi io non ho solo n processi figli da killare, ma quegli n + eventuali altri servi.

Il termine "gruppo" l'ho usato io, non o se questo problema può rientrare in questa categoria.
Codice:
for (i=0; i<n; i++) {
		printf("Invio segnale di terminazione al processo%d \n",pid_processi[i]);
		kill(pid_processii[i],SIGKILL);
		printf("Attendo che  %d termini \n",pid_processi[i]);
		waitpid(pid_processi[i],&status,0);
	}	
	
	free(pid_processi);
	*pid_processi=NULL;
	
	//killa eventuali altri figli(i servi) IMMEDIATAMENTE
	kill(0,SIGKILL); // mi killa tutti i processi con lo stesso PGID del padre, ovvero tutti i figli restanti!
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2004, 15:06   #8
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da cn73
Codice:
for (i=0; i<n; i++) {
		printf("Invio segnale di terminazione al processo%d \n",pid_processi[i]);
		kill(pid_processii[i],SIGKILL);
		printf("Attendo che  %d termini \n",pid_processi[i]);
		waitpid(pid_processi[i],&status,0);
	}
L'efficienza è un'opinione?
Codice:
for (i=0; i<n; i++) kill(pid_processi[i],SIGKILL);
for (i=0; i<n; i++) waitpid(pid_processi[i],&status,0);
Attento qui:
Quote:
Codice:
	kill(0,SIGKILL); // mi killa tutti i processi con lo stesso PGID del padre, ovvero tutti i figli restanti!
...compreso il padre.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2004, 15:14   #9
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
Quote:
for (i=0; i<n; i++) kill(pid_processi[i],SIGKILL);

for (i=0; i<n; i++) waitpid(pid_processi[i],&status,0);
Ma facendo così non rischio che un processo termini prima che il padre si metta in wait??

Quote:
compreso il padre....
mmm questo devo verificarlo...da manuale non è chiarissimo:
Quote:
ProcessID Specifies a decimal integer representing a process or process
group to be signaled.

If PID is a positive value, the kill command sends the process whose process ID is equal to the PID. If the PID value is 0, the kill command sends the signal to all processes having
a process group ID equal to the process group ID of the sender. Thesignal is not sent to processes with a PID of 0 or 1.
If the PID is-1, the kill command sends the signal to all processes owned by theeffective user of the sender. The signal is not sent to processeswith a PID of 0 or 1.
If it is a negative number but not -1, the killcommand sends the signal to all processes that have a process groupID equal to the absolute value of the PID.
A questo proposito...come vengono assegnati gli id di gruppo?? Non è che rischio di killare altri processi che non centrano nulla??
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2004, 15:18   #10
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da cn73
Ma facendo così non rischio che un processo termini prima che il padre si metta in wait??
Probabilmente (visto tra l'altro che usi SIGKILL). Dov'è il problema?

Quote:
mmm questo devo verificarlo...da manuale non è chiarissimo
Il gpid di un processo padre dovrebbe essere il proprio pid, di default (dipende da come viene lanciato, credo). Quello di un figlio dovrebbe essere quello del padre, se non lo cambi o non usi setsid dal figlio.

Quote:
A questo proposito...come vengono assegnati gli id di gruppo?? Non è che rischio di killare altri processi che non centrano nulla??
Ho incontrato un simile bug con kde. L'ho risolto eseguendo manualmente setsid all'inizio del processo padre.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2004, 15:25   #11
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
ovvero se mi metto in wait di un processo che non esiste più non ho problemi? se ne accorge ed esce ?

Quote:
Ho incontrato un simile bug con kde. L'ho risolto eseguendo manualmente setsid all'inizio del processo padre
Ma chi sei??
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2004, 11:57   #12
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
Si il gpid del padre è settato al pid...perciò non posso usare una kill(0) o una kill (-pid) perchè morirebbe anche il Padre...
Approfondisco il discorso sul setsid...
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2004, 12:48   #13
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
Fatto!
Per il secondo gruppo di processi creo un gruppo con un leader), tengo traccia del gpid del gruppo e poi li killo con killpg
Codice:
#include<stdio.h>
#include<errno.h>
#include<signal.h>
#include<sys/types.h>

main (){
	int i,f;	
	
	pid_t *pid_processi=NULL;
	char *fil_num;
	int sid;	
	
	pid_processi=(int *)malloc(3*sizeof(pid_t));
	fil_num=(char *)malloc(2*sizeof(char));
		
	printf("PADRE! gpid: %d -- pid: %d -- sid: %d\n",getpgid(),getpid(),getsid());	
	
	for (i=0; i < 3; i++) {
		f = pid_processi[i] = fork();
		sprintf(fil_num,"%d",i);
		printf("fil_num: %d ",i,fil_num);
		if (f == 0) 
			execl("./s","./s",NULL); //n e fil_num sono gl iargomenti passati al filosofo
	}	
	
	for (i=0; i < 3; i++) 
		//printf("pid_processi[%d]: %d ",i,pid_processi[i]);
	printf("\n");
		
	f = sid = fork();	
	if (f==0){
			setsid(); //nuovo gruppo!
			printf("SERVO LEADER! gpid: %d -- pid: %d -- sid: %d\n",getpgid(),getpid(),getsid());
			i=0;		
			while(i< 3) {	
				i++;
				f = fork();
				if (f==0){ //ereditano i gpgid del leader
					printf("SERVO! gpid: %d -- pid: %d -- sid: %d\n",getpgid(),getpid(),getsid());
					system("sleep 5");
					exit(0);
				}
			}	
		exit(0);	
	}	
	for (i=0; i < 3; i++) 
		kill(pid_processi[i],SIGKILL);
	
	for (i=0; i < 3; i++) 
		wait(pid_processi[i]);	
	
	printf("PADRE! gpid: %d -- pid: %d -- sid: %d\n",getpgid(),getpid(),getsid());		
		
	killpg(sid,SIGKILL); 
		
	printf("termino anche io!\n");
	exit(0);	
	
}
cn73 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più Dreame X60 Pro Ultra Complete: i bracci si esten...
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati TCL 65C8L, la recensione del SQD-Mini LED da 440...
Il futuro è arrotolabile: Samsung punta ...
Meno giochi di terze parti per il futuro...
iOS e iPadOS 26.5.2 ufficiali: quasi 30 ...
macOS Tahoe 26.5.2 rilasciato: nessuna n...
Apple non vuole perdere tempo: i nuovi M...
Motorola Edge 70 Fusion a 284€, prezzo p...
Clamoroso schiaffo a Xbox: l'80% degli u...
GTA 6 a 60 FPS su console: spuntano i de...
Prezzi di un anno fa e di oggi: ECOVACS ...
iPhone 18e: Apple ricicla il display a 6...
AMD Zen 6 introdurrà un nuovo cor...
Recensione NZXT H2 Flow: tutta la potenz...
OpenClaw, addio Telegram: app native per...
287€: questo è il super prezzo pe...
General Fusion punta sull'Italia: il sog...
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:24.


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