Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
In occasione del proprio Snapdragon Summit Qualcomm annuncia i due nuovi chip per dispositivi mobile di fascia alta che entreranno nel mercato nel corso del 2027: tanta potenza a disposizione per elaborazioni di intelligenza artificiale sempre più complesse
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
Hogwarts arriva in fascia media grazie a realme, con una special edition che unisce la Quadra Light-Sensing Color-changing Tech, un baule in stile Hogwarts Express pieno di collezionabili e una scheda tecnica sostanzialmente identica al 16 Pro di partenza: ecco cosa cambia davvero, come si comporta nell'uso quotidiano e quanto vale in base al prezzo di 699,99 euro
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-05-2006, 10:15   #1
Sirbako
Senior Member
 
L'Avatar di Sirbako
 
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
[C] Signal (ctrl+z) problemi

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

void ciao(){
printf("ciao\n");
sleep(10);
}

int main(){
pid_t pid1,pid2;
signal (SIGTSTP,ciao);

pid1=fork();
if (!pid1){
	printf("gimp\n");
	execlp("gimp","gimp",0);
}
else {
 pid2=fork();
  if (!pid2){
	 printf("xmms\n");
	 execlp("xmms","xmms",0);
  }else{
		    printf("stop\n");	
		   sleep(60);
     }
}
}
cc
praticamente, se si da CTRL+Z dovrebbe stampare solo "ciao" e non bloccare niente.. invece stampa "ciao" e blocca entrambi i processi..
dove sta l'inghippo?
__________________

Esse.Ti.?!?
Sirbako è offline   Rispondi citando il messaggio o parte di esso
Old 17-05-2006, 10:59   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Sirbako
praticamente, se si da CTRL+Z dovrebbe stampare solo "ciao" e non bloccare niente.. invece stampa "ciao" e blocca entrambi i processi..
Provo a rispondere io, anche se premetto subito che non sono esperto dei "signal" su sistemi Linux/Unix.

Modificherei il codice così:
Codice:
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>

pid_t pid1,pid2;    /* globali */

void ciao(){
printf("ciao\n");
kill (pid1, SIGCONT);    /* riavvia figlio 1 */
kill (pid2, SIGCONT);    /* riavvia figlio 2 */
sleep(10);
}

int main(){
signal (SIGTSTP,ciao);

pid1=fork();
if (!pid1){
	printf("gimp\n");
	execlp("gimp","gimp",0);
}
else {
 pid2=fork();
  if (!pid2){
	 printf("xmms\n");
	 execlp("xmms","xmms",0);
  }else{
		    printf("stop\n");	
		   sleep(60);
     }
}
}
Quando fai CTRL+Z, sei nel contesto del processo padre. Quando viene eseguito il signal handler in pratica si dovrebbero riavviare i 2 processi figli con il segnale SIGCONT. Io ho provato e sembra funzionare. Ma ripeto ... non sono esperto di 'ste cose.

EDIT: c'è una documentazione dei segnali legati ai job qui.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet

Ultima modifica di andbin : 17-05-2006 alle 11:06.
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 17-05-2006, 17:10   #3
Sirbako
Senior Member
 
L'Avatar di Sirbako
 
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
Quote:
Originariamente inviato da andbin
Provo a rispondere io, anche se premetto subito che non sono esperto dei "signal" su sistemi Linux/Unix.

Modificherei il codice così:
Codice:
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>

pid_t pid1,pid2;    /* globali */

void ciao(){
printf("ciao\n");
kill (pid1, SIGCONT);    /* riavvia figlio 1 */
kill (pid2, SIGCONT);    /* riavvia figlio 2 */
sleep(10);
}

int main(){
signal (SIGTSTP,ciao);

pid1=fork();
if (!pid1){
	printf("gimp\n");
	execlp("gimp","gimp",0);
}
else {
 pid2=fork();
  if (!pid2){
	 printf("xmms\n");
	 execlp("xmms","xmms",0);
  }else{
		    printf("stop\n");	
		   sleep(60);
     }
}
}
Quando fai CTRL+Z, sei nel contesto del processo padre. Quando viene eseguito il signal handler in pratica si dovrebbero riavviare i 2 processi figli con il segnale SIGCONT. Io ho provato e sembra funzionare. Ma ripeto ... non sono esperto di 'ste cose.

EDIT: c'è una documentazione dei segnali legati ai job qui.
so che così continua, ma a me interessa che non vengano fermati..
__________________

Esse.Ti.?!?
Sirbako è offline   Rispondi citando il messaggio o parte di esso
Old 17-05-2006, 20:01   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Sirbako
so che così continua, ma a me interessa che non vengano fermati..
Se vuoi è possibile fare in modo che la sequenza CTRL+Z venga vista come un tasto qualunque, cioè non come una combinazione "speciale" la cui azione fa andare in background il processo.
Basta mettere all'inizio del programma (nota, includere <termios.h>):
Codice:
struct termios tios;

if (tcgetattr (1, &tios) == 0)
{
    tios.c_cc[VSUSP] = _POSIX_VDISABLE;

    if (tcsetattr (1, TCSANOW, &tios) != 0)
        printf ("tcsetattr error\n");
}
else
    printf ("tcgetattr error\n");
In questo modo non è possibile mandare in background il processo usando una combinazione di tasti.

Non so se ti va bene, ovviamente.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 17-05-2006, 21:45   #5
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Codice:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

void ciao(int unused)
{
	write(STDOUT_FILENO, "ciao\n", 5);
}

int main(void)
{
	signal(SIGTSTP, ciao);

	if (! fork()) {
		puts("gimp");
		signal(SIGTSTP, SIG_IGN);
		execlp("gimp", "gimp", NULL);
		_exit(EXIT_FAILURE);
	}
        if (! fork()) {
		puts("xmms");
		signal(SIGTSTP, SIG_IGN);
		execlp("xmms", "xmms", NULL);
		_exit(EXIT_FAILURE);
	} 
	puts("stop");
	sleep(60);
	puts("done");
	wait(NULL);
	wait(NULL);
	return 0;
}
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 17-05-2006, 21:51   #6
beppegrillo
Senior Member
 
L'Avatar di beppegrillo
 
Iscritto dal: Mar 2004
Messaggi: 1455
La signanl handler dovrebbe avere il seguente prototipo
void func(int signum).
Hai provato a fargli scrivere solo ciao senza fare la sleep? Che cosa ottieni?
Cmq se le tue intenzioni sono quelle di rendere il processo immune dal segnale SIGSTOP puoi fare molto velocemente con
signal(SIGSTP,SIG_IGN);
__________________
Ciao ~ZeRO sTrEsS~
beppegrillo è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2006, 12:21   #7
Sirbako
Senior Member
 
L'Avatar di Sirbako
 
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
Quote:
Originariamente inviato da Qu@ker
Codice:
...
fa in modo che i figli nn si stoppano, però:
Codice:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
pid_t f1,f2;

void ciao(int unused)
{	
	kill(f1,SIGTSTP);
	printf("ciao %d\n",f1);
	
}


int main(void)
{
	signal(SIGTSTP, ciao);

	if (! (f1=fork())) {
		puts("gimp");#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

void ciao(int unused)
{
	write(STDOUT_FILENO, "ciao\n", 5);
}

int main(void)
{
	signal(SIGTSTP, ciao);

	if (! fork()) {
		puts("gimp");
		signal(SIGTSTP, SIG_IGN);
		execlp("gimp", "gimp", NULL);
		_exit(EXIT_FAILURE);
	}
        if (! fork()) {
		puts("xmms");
		signal(SIGTSTP, SIG_IGN);
		execlp("xmms", "xmms", NULL);
		_exit(EXIT_FAILURE);
	} 
	puts("stop");
	sleep(60);
	puts("done");
	wait(NULL);
	wait(NULL);
	return 0;
}
		signal(SIGTSTP, SIG_IGN);
		execlp("gimp", "gimp", NULL);
		_exit(EXIT_FAILURE);
	}
    if (! (f2=fork()) ) {
		puts("xmms");
		signal(SIGTSTP, SIG_IGN);
		execlp("xmms", "xmms", NULL);
		_exit(EXIT_FAILURE);
	} 
	puts("stop");
	sleep(60);
	puts("done");
	wait(NULL);
	wait(NULL);
	return 0;
}
non va, cioè anche se mando il kill non si ferma..
come posso fare?
__________________

Esse.Ti.?!?
Sirbako è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2006, 17:17   #8
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da Sirbako
Codice:
...
        if (! fork()) {
		puts("xmms");
		signal(SIGTSTP, SIG_IGN);
		execlp("xmms", "xmms", NULL);
		_exit(EXIT_FAILURE);
	} 
...
Completamente sbagliato!

Come può una _funzione_ impostata con "signal" essere ereditata dal processo chiamato in exec? Quando chiami la exec, il nuovo processo _sostituisce_ l'immagine in memoria del processo chiamante, comprese le funzioni che gestiscono i segnali.

L'unica cosa che puoi ereditare tramite la exec è la _maschera_ dei segnali; ad esempio puoi impostare SIGTSTP come "mascherato" prima di effettuare le exec:
Codice:
        if (! fork()) {
		sigset_t ss;
		sigemptyset(&ss);
		sigaddset(&ss, SIGTSTP);
		sigprocmask(SIG_BLOCK, &ss, NULL);
		execlp(<...>);
		_exit(EXIT_FAILURE);
	}
In alternativa, se non vuoi mascherare il segnale ma semplicemente evitare che bash invii il segnale anche ai child, creali in una nuova sessione:
Codice:
        if (! fork()) {
		setsid();
		execlp(<...>);
		_exit(EXIT_FAILURE);
	}
__________________
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 19-05-2006, 19:31   #9
Sirbako
Senior Member
 
L'Avatar di Sirbako
 
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
Quote:
Originariamente inviato da ilsensine
Completamente sbagliato!

[/code]

a dire il vero se do SIGSTOP invece che SIGNSTP funziona tutto come dovrebbe
il SIGIGN funziona.. prova
__________________

Esse.Ti.?!?
Sirbako è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2006, 19:38   #10
Sirbako
Senior Member
 
L'Avatar di Sirbako
 
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
così funzione (apre 2 gimp, blocca solo il primo, per 10 secondi)
Codice:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

pid_t f1,f2;

void ciao()
{		
	kill(f1,SIGSTOP);
	printf("stoppo figlio 1 %d\n");
	sleep(10);
	kill(f1,SIGCONT);
}


int main(void)
{
	signal(SIGTSTP, ciao);
	if (! (f1=fork())) {
		puts("gimp");
	signal(SIGTSTP, SIG_IGN);
		execlp("gimp", "gimp", NULL);
		_exit(EXIT_FAILURE);
	}
 	else
    if (! (f2=fork()) ) {
		puts("gimp2");
		signal(SIGTSTP, SIG_IGN);
			execlp("gimp", "gimp", NULL);
		_exit(EXIT_FAILURE);
	} 
	puts("stop");
	sleep(60);
	puts("done");
	wait(NULL);
	wait(NULL);
	return 0;
}
__________________

Esse.Ti.?!?
Sirbako è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2006, 20:34   #11
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Quote:
Originariamente inviato da ilsensine
Completamente sbagliato!

Come può una _funzione_ impostata con "signal" essere ereditata dal processo chiamato in exec? Quando chiami la exec, il nuovo processo _sostituisce_ l'immagine in memoria del processo chiamante, comprese le funzioni che gestiscono i segnali.
Infatti io non ho impostato una funzione. Ho stabilito di ignorare un certo segnale. E, sono sicuro che la cosa ti stupirà, guarda un po' cosa succede:
Codice:
goku@big:~$ info libc Processes 'Executing a File' 2>/dev/null |
> sed -ne '136,138p' | cut -d'.' -f1 && echo

   Signals that are set to be ignored in the existing process image are
also set to be ignored in the new process image

goku@big:~$
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2006, 07:23   #12
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da Qu@ker
Infatti io non ho impostato una funzione. Ho stabilito di ignorare un certo segnale. E, sono sicuro che la cosa ti stupirà, guarda un po' cosa succede:
Hai ragione, chiedo scusa. SIG_IGN è una direttiva, non un handler particolare, e può essere ereditata.
__________________
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
 Rispondi


Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole! realme 16 Pro Harry Potter Edition: il nuovo mid...
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
ASUS GPU Tweak III introduce lo spegnime...
Batterie per auto elettriche più ...
99,99€: imperdibile la soundbar LG S40T ...
Vivo X500 Series in arrivo anche in Euro...
Addio LiveNetTV: il raid della polizia m...
WhatsApp lavora a una nuova funzione per...
Un simil MacBook, ma con la RTX 5070: MS...
GAC Aion UT in anteprima, la piccola ele...
La Cina sfida Samsung e Micron: CXMT avv...
ECOVACS T50 OMNI Gen3 a 379€ non ha riva...
iPhone Duo, i video in 4K potrebbero sur...
Micron manda in pensione i chip GDDR7 da...
The Witcher 4: la scelta dell'Unreal Eng...
XBOX, il reset continua con nuovi licenz...
Apple AirTag torna a 26€, quello di seco...
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:40.


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