Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Sono molte le novità che ASUS ha scelto di presentare al CES 2026 di Las Vegas, partendo da una gamma di soluzioni NUC con varie opzioni di processore passando sino agli schermi gaming con tecnologia OLED. Il tutto senza dimenticare le periferiche di input della gamma ROG e le soluzioni legate alla connettività domestica
Le novità ASUS per il 2026 nel settore dei PC desktop
Le novità ASUS per il 2026 nel settore dei PC desktop
Molte le novità anticipate da ASUS per il 2026 al CES di Las Vegas: da schede madri per processori AMD Ryzen top di gamma a chassis e ventole, passando per i kit di raffreddamento all in one integrati sino a una nuova scheda video GeForce RTX 5090. In sottofondo il tema dell'intelligenza artificiale con una workstation molto potente per installazioni non in datacenter
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-06-2010, 00:48   #1
Tarrion
Senior Member
 
L'Avatar di Tarrion
 
Iscritto dal: Feb 2007
Messaggi: 310
[C] Terminare processo dopo tot tempo

salve a tutti, sto sviluppando un piccolo .exe che svolga questa funzione:

-se un dato processo è in esecuzione da più di tot minuti lo termina;

sono riuscito a scrivere questo (per esempio: termina notepad.exe se è aperto da più di 10 min):

Codice:
 
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    system("taskkill /fi \"cputime gt 00:10:00\" /im notepad.exe /f");
    return(0);
}
come potete notare ho usato il comando di dos taskkill.
Tutto viene compilato ed eseguito senza errori, ma ho dei dubbi su come venga calcolato quel cputime perché ho provato a fare una verifica settando il tempo a 10 secondi (per evitare di aspettare 10 minuti ogni volta):

-apro notepad.exe
-aspetto più di 10 secondi
-eseguo il programmino di cui sopra

il problema è che notepad non viene chiuso!
L'unica risposta che so darmi è che il cputime non coincide con il tempo trascorso dall'esecuzione di notepad.exe.
A questo punto che posso fare? Come risolvo/aggiro il problema?
Grazie per ogni eventuale aiuto.
Tarrion è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 01:11   #2
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
partiamo dal presupposto che il tuo avatar é bellissimo!!

detto questo, ho provato sul mio PC ad eseguire quel comando taskkill nel prompt dei comandi e non funziona; credo di aver capito il motivo: quello che lui chiama "CPU time" non é il tempo per cui il programma é rimasto in esecuzione, bensi il tempo per cui il programma ha usato la CPU, che nel caso di Blocco Note é quasi zero (o comunque meno di un secondo) nella stragrande maggioranza dei casi visto quanto é semplice.

infatti poi ho provato a mettergli "CPUTIME ge 00:00:00" e ha funzionato.

non credo che il comando taskkill ti permetta di risolvere, io piuttosto userei le PSAPI in aggiunta a questa: http://msdn.microsoft.com/en-us/libr...23(VS.85).aspx

qui hai il reference delle PSAPI: http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx

in particolare, per enumerare i processi usa questa: http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx

e per conoscere il nome del modulo eseguibile usato per creare il processo (il file .exe, approssimativamente parlando) usa invece questa passando NULL al secondo parametro: http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 01:21   #3
Tarrion
Senior Member
 
L'Avatar di Tarrion
 
Iscritto dal: Feb 2007
Messaggi: 310
Grazie (anche per il complimento sull'avatar)! Domattina farò dei tentativi e posterò i risultati.
Tarrion è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2010, 10:01   #4
Tarrion
Senior Member
 
L'Avatar di Tarrion
 
Iscritto dal: Feb 2007
Messaggi: 310
Molto bene, ho dato una bella spulciata a queste PSAPI e mi sembrano adatte all'occasione.
Unico problema: non le so usare!
La mia conoscenza di C si limita al primo corso di informatica alla facoltà di matematica, quindi non so maneggiare oggetti del genere.
Ho capito comunque che c'è un modo per far si che una di queste PSAPI restituisca un puntatore ad una struttura che contiene il valore del tempo di esecuzione in "user mode"; quello che resta da fare è implementarla nel mio codice in questo modo:

-trova il tempo di esecuzione del processo "nomeprocesso.exe";
-se è maggiore di 10 minuti terminalo;

come scrivo il punto 1? (io conosco già il nome dell'eseguibile, e solo quello)

edit: spulciando ancora ho trovato la funzione Process.GetProcessesByName(), può tornare utile?

Ultima modifica di Tarrion : 04-06-2010 alle 10:40.
Tarrion è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 10:06   #5
Tarrion
Senior Member
 
L'Avatar di Tarrion
 
Iscritto dal: Feb 2007
Messaggi: 310
Allora, dopo qualche altro giorno di ricerca ho capito che devo riuscire a ottenere l'handler del processo che mi interessa tramite il suo nome; ma francamente non ho idea di quale sia il codice da inserire per far eseguire questa funzione al mio programma.
Penso che non sia una cosa così difficile, ma vi giuro non so proprio da dove partire, per questo chiedo se gentilmete qualcuno può darmi una mano nella scrittura codice. Grazie.
Tarrion è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 10:36   #6
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Puoi mandare in esecuzione un alarm(secondi) e gestire il segnale in modo opportuno!
Es
Codice:
{
    signal(SIGALRM, sig_handler);//funzione del gestore del segnale
    alarm(10);//dopo 10 secondi invio di un segnale SIGALRM
    //altra roba.....
}

void sig_handler(){
    kill(getpid(), SIGINT);
}

//e ovviamente puoi mettere un gestore per SIGINT
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 12:13   #7
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da clockover Guarda i messaggi
Puoi mandare in esecuzione un alarm(secondi) e gestire il segnale in modo opportuno!
Es
Codice:
{
    signal(SIGALRM, sig_handler);//funzione del gestore del segnale
    alarm(10);//dopo 10 secondi invio di un segnale SIGALRM
    //altra roba.....
}

void sig_handler(){
    kill(getpid(), SIGINT);
}

//e ovviamente puoi mettere un gestore per SIGINT
La signal() su Windows?
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 12:16   #8
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
La signal() su Windows?
ehmm... sorry... piccolo rincoglionimento...
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 12:29   #9
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Ho notato.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 12:53   #10
Tarrion
Senior Member
 
L'Avatar di Tarrion
 
Iscritto dal: Feb 2007
Messaggi: 310
A me basterebbe anche scrivere una cosa così:

-ottieni handler per notepad (o-quello-che-è)
-passa handler alla funzione PSAPI GetProcessTimes per ottenere l'user time
-se l'user time è maggiore di 10 minuti (o-quello-che-è) [ammesso che l'user time rappresenti quello che mi serve], termina notepad
-fine

a questo punto penso che una volta ottenuto l'handler io sia in grado di scrivere il resto del codice (dovrei ancora ricordarmi come gestire i puntatori), ma il problema grosso è proprio, ripeto, il primo punto!
Tarrion è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 14:06   #11
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da Tarrion Guarda i messaggi
a questo punto penso che una volta ottenuto l'handler io sia in grado di scrivere il resto del codice
una nota: per terminare il processo ci sono diverse maniere che ti elenco in ordine di brutalitá (l'ultima é la piu brutale e funziona per forza se il sistema di sicurezza lo concede):
1. prova ad inviare WM_CLOSE alla finestra principale
2. provare ad inviare WM_QUIT al thread primario
3. TerminateProcess



Quote:
ma il problema grosso è proprio, ripeto, il primo punto!
per trovare l'HANDLE del processo di notepad devi:
- enumerare i PID di tutti i processi usando EnumProcesses
- per ciascun PID devi invocare OpenProcess (che per alcuni PID potrebbe fallire)
- usare l'HANDLE eventualmente restituito da OpenProcess con GetModuleBaseName
- confrontare in maniera case-insensitive la stringa restituita da GetModuleBaseName con la stringa "notepad.exe" (occhio all'Unicode, usa la macro _T)

e alla fine chiudi l'HANDLE del processo con CloseHandle.

ovviamente potrebbero esserci piu istanze di notepad.exe in esecuzione, nel qual caso troveresti molteplici HANDLEs.

una nota importante: no, lo user time non é quello che intendi tu; quello é lo stesso tempo considerato dal comando taskkill, cioé il tempo per il quale i thread del processo hanno usato la CPU in modalitá utente; per la stragrande maggioranza del tempo che resta in esecuzione Blocco Note resta bloccato in attesa di input, quindi i suoi thread (anzi, il suo thread, perché ho proprio idea che ne abbia uno solo) non usano la CPU.

il tempo che devi considerare é il tempo di creazione del processo: devi sottrarlo alla data corrente e vedere se é maggiore della soglia da te stabilita. per trovare la data corrente puoi usare GetSystemTimeAsFileTime, che ti restituisce una data UTC in una struttura FILETIME (stesso formato usato dalla GetProcessTimes).

di seguito ti indico le pagine di riferimento delle funzioni che avevo tralasciato nel post precedente.
TerminateProcess: http://msdn.microsoft.com/en-us/libr...14(VS.85).aspx
CloseHandle: http://msdn.microsoft.com/en-us/libr...11(VS.85).aspx
OpenProcess: http://msdn.microsoft.com/en-us/libr...20(VS.85).aspx
GetSystemTimeAsFileTime: http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx

dovrebbe essere tutto, non ti resta che provare...
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 14:09   #12
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da fero86 Guarda i messaggi
(anzi, il suo thread, perché ho proprio idea che ne abbia uno solo)
verificato ora con Spy++: ne ha uno solo
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2010, 14:23   #13
Tarrion
Senior Member
 
L'Avatar di Tarrion
 
Iscritto dal: Feb 2007
Messaggi: 310
Ok, ora inizio i tentativi, ma avviso i gentili forumspettatori che mi addentro in mondi di C a me sconosciuti, quindi penso che a breve dovrò abusare ancora della vostra infinita pazienza e disposizione per altri aiuti.

Ad ogni modo grazie per tutto quello che mi hai detto finora, sei stato illuminante.
Tarrion è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2010, 01:45   #14
Tarrion
Senior Member
 
L'Avatar di Tarrion
 
Iscritto dal: Feb 2007
Messaggi: 310
No, sentite, più mi perdo dentro queste PSAPI e più mi rendo conto che sono oggetti fuori dalla mia portata! Quando mi sono proposto di fare questo programmino non pensavo fosse necessaria una tale conoscenza di C (speravo di poter fare tutto passando dei comandi al prompt di DOS).

Ma è possibile che sia così difficile da dos ottenere almeno l'ora di creazione di un processo?

Mi dispiace veramente, ma non ho proprio il tempo di imparare ad usare le PSAPI; solo che questo programmino mi tornerebbe davvero utile e vorrei poter trovare una soluzione.
Tarrion è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2010, 13:29   #15
Tarrion
Senior Member
 
L'Avatar di Tarrion
 
Iscritto dal: Feb 2007
Messaggi: 310
dopo qualche ora di sforzi, sono riuscito a sfornare una bozza di codice che dovrebbe fare quello di cui ho bisogno (il nome del processo da terminare è client.exe, il tempo minimo di esecuzione è 9 min e ho anche aggiunto un for nel caso ce ne siano due aperti):

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <ATLComTime.h>
#include <psapi.h>

int main(void)
{
    int i=0;
    HANDLE hProcess;
    FILETIME ftCreation, ftExit, ftKernel, ftUser;
    DWORD SetOfPID[2];
    COleDateTime timeNow = GetCurrentTime(), timeMin(0,0,0,0,9,0);
    COleDateTimeSpan timeDiff;

GetProcessID("client",SetOfPID);

for (i;i < 2; i++)
    {
      HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, SetOfPID[i]);
      
      GetProcessTimes(hProcess, &ftCreation, &ftExit, &ftKernel, &ftUser);
      
      timeDiff = timeNow - timeCreation;


      if(timeDiff > timeMin)
      {
                  system("taskkill /im client.exe /f");
                  }


        CloseHandle(hProcess);
        }

return(0);
}
solo che il compilatore mi da un unico orribile errore:

-COleDateTime Undecleared

io ho incluso all'inizio ATLComTime.h, ma ho controllato delle directory di DEV e questo header non c'è... dove lo trovo?

Per il resto il codice vi sembra decente? Cosa dovrei correggere?
Tarrion è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2010, 16:43   #16
Tarrion
Senior Member
 
L'Avatar di Tarrion
 
Iscritto dal: Feb 2007
Messaggi: 310
Ho risolto! (in realtà ho aggirato il problema)

Ho imparato in un'oretta qualche comando di base di Python e in 5 righe ho scritto il programma:
Codice:
import psutil
import time
for pid in psutil.get_pid_list():
	p = psutil.Process(pid)
	if p.name == 'notepad.exe':
		if time.time() - p.create_time >= 540:
			p.kill()
Mi dispiace di non esserci riuscito con C, ma alla fine è il risultato che conta!

Grazie di tutto
Tarrion è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2010, 16:47   #17
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
per quale recondito motivo stai usando COleDateTime?
quella é una classe, non la puoi usare in C. l'header ci sta, altrimenti il compilatore non te lo troverebbe e ti darebbe l'errore sull'#include anziché su COleDateTime; il motivo per cui ti dice che l'identificatore non é dichiarato é che evidentemente quell'header é portabile, cioé funziona anche in C, solo che in C non ti permette di importare le classi e quindi non ti fornisce nessuna COleDateTime.

che problema c'era a usare GetSystemTimeAsFileTime?

e quell'altra funzione GetProcessID é tua?
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2010, 16:49   #18
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da Tarrion Guarda i messaggi
Ho risolto! (in realtà ho aggirato il problema)

Ho imparato in un'oretta qualche comando di base di Python e in 5 righe ho scritto il programma:
ah... ok...

calcola che questo thread é un win per cdimauro
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2010, 16:56   #19
Tarrion
Senior Member
 
L'Avatar di Tarrion
 
Iscritto dal: Feb 2007
Messaggi: 310
Guarda, quel codice in c è nato da una specie di collage di pezzi trovati nella rete, non so bene cosa ho scritto, ma alla fine ho "risolto" così.
Dato che avevo abbastanza premura di completare questo programma (devo preparare due esami), sono contento di aver sistemato la faccenda anche se magari con un linguaggio brutto e meno potente, ma davvero non ho tempo per combattere con queste cose.
Ad ogni modo ti ringrazio per il tempo che mi hai dedicato e spero che questo topic possa essere utile anche a qualcunaltro più volenteroso di me!
Tarrion è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2010, 17:48   #20
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
non c'é di che, solo una cosa peró:

Quote:
sono contento di aver sistemato la faccenda anche se magari con un linguaggio brutto e meno potente, ma davvero non ho tempo per combattere con queste cose.
hai capito male, se c'é un linguaggio brutto e poco potente quello é proprio C. non sei l'unico a cui preme la produttivitá, anzi, preme a tutte le persone dotate di un minimo di cervello
fero86 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Le novità MSI del 2026 per i videogiocatori Le novità MSI del 2026 per i videogiocato...
I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers I nuovi schermi QD-OLED di quinta generazione di...
POCO M8: display AMOLED luminoso, batter...
ECOVACS, tante novità a Las Vegas...
Caso Galaxy Ring difettoso: Samsung chiu...
Targa e assicurazione per monopattini el...
AI Cloud Protect: la soluzione di Check ...
Nuovo spettacolare video del razzo spazi...
Hisense presenta a CES 2026 il display M...
XPeng P7+ è pronta per l'Europa: ...
IKEA nuove lampade Matter annunciate al ...
Il telescopio Hubble potrebbe andare dis...
Hisense introduce RGB MiniLED evo (a qua...
Deumidificatore De'Longhi in offerta su ...
OnePlus 15R: il 'battery phone' pi&ugrav...
Beats Studio Pro a un super prezzo su Am...
Car of the Year, la Mercedes CLA eletta ...
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: 19:01.


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