Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
Nelle ultime settimane abbiamo provato tre delle proposte top di gamma di NZXT nelle categorie case, dissipatori e ventole. Rispettivamente, parliamo dell'H9 Flow RGB+, Kraken Elite 420 e F140X. Si tratta, chiaramente, di prodotti di fascia alta che si rivolgono agli utenti DIY che desiderano il massimo per la propria build. Tuttavia, mentre i primi due dispositivi mantengono questa direzione, le ventole purtroppo hanno mostrato qualche tallone d'Achille di troppo
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-04-2009, 14:25   #1
Zero-Giulio
Member
 
Iscritto dal: May 2007
Messaggi: 292
[C/C] Chiamare un programma da codice

Ok, il titolo è da culo. Non sapevo cosa scrivere.

Allora, questo è il mio problema:

Ho due programmi (scritti in C), A e B. B va eseguito dentro A. Nel senso che:

1 - eseguo A fino a un certo punto, poi A scrive qualche files e va in pausa;

2 - eseguo B dando in input l'output di A ed eseguondolo fino alla fine. B restituisce una serie di files;

3 - riprendo A da dove lo avevo lasciato, facendogli leggere l'output di B e portandolo fino al suo termine.

Il punto fondamentale di tutto la questione è che i due programmi, A e B, devono rimanere DISTINTI. Non posso, in sostanza, scrivere un programma con dentro entrambi i codici, uno annidato nell'altro.

Forse vi suonerà strano, non so se vi viene in mente il perchè di questo. Non mi va di raccontarlo, e non vorrei entrare nei particolari.

L'unica cosa è che, di fatto, i due programmi devono rimanere distinti, e uno va eseguito quando l'altro è a metà, in pausa.

Attualmente, quello che faccio è rude: praticamente avvio A, poi lo metto in pausa (lui mi chiede inputs che io non gli do, per il momento), eseguo (dall'inizio alla fine) B, continuo con A (rispondendo all'input) fino alla fine.

Vorrei implementare una soluzione più elegante. A livello di codice, magari. E' possibile da codice far eseguire un programma? Preferisco soluzioni universali, ma in assenza di queste vanno bene anche soluzioni ad hoc per il mio SO, che è WinXp.
Zero-Giulio è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2009, 14:38   #2
agente mm8
Senior Member
 
Iscritto dal: Mar 2008
Messaggi: 401
La mia è solo un'idea: potresti creare un file "pause", e verifichi con il programma A se questo file contiene qualche carattere in un ciclo while: se c'è passi avanti.
Con il programma B, dopo aver eseguito tutte le operazioni, scrivi uno 0 (o quello che vuoi) sul file "pause". Il programma A, vedendo che il file "pause" contiene un carattere, continuerà a fare il suo lavoro.
Ripeto, è solo una mia idea, spero possa esserti d'aiuto.
agente mm8 è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2009, 21:01   #3
Zero-Giulio
Member
 
Iscritto dal: May 2007
Messaggi: 292
Ma il programma B come lo chiamo?

Una volta che A entra in pausa, quello che vorrei è che il sistema lanciasse in automatico il programma B.
Zero-Giulio è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2009, 22:24   #4
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
Premetto: non so esattamente le tue esigenze, ma vedi se la finzione spawn, con le sue varianti, possa fare al caso tuo.

spawn esegue un processo (puoi passare parametri, environment: link a documentazione ) ed utilizzando la modalita' P_WAIT, attende la sua terminazione.

Per esempio:

Codice:
#include <process.h>
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    //stampa "inizio"
    cout << "inizio" << endl;

    //lancia "notepad.exe" ... e ne attende la chiusura...
    _spawnl( _P_WAIT, "c:/windows/notepad.exe", NULL );

    //stampa fine... dopo la chiusura di notepad
    cout << "fine" << endl;
    return 0;
}

Ultima modifica di BrutPitt : 03-04-2009 alle 22:37.
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2009, 17:35   #5
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
A rigore non è possibile ciò che chiedi senza intervenire direttamente all'interno dei due programmi.
Si potrebbe agire sul contesto in cui operano (es. sviscerando i messaggi del sistema) ma è molto molto difficile, faresti prima a riscrivere tutto da zero.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 05-04-2009, 13:52   #6
Zero-Giulio
Member
 
Iscritto dal: May 2007
Messaggi: 292
Proverò con la spawnl.

Se non funziona, beh... Lascio così com'è...

Alla fine il programma non devo mandarlo in giro. Serve solo a me. E io posso benissimo fare tutto a mano, tanto sono solo un apio di click.

Certo però che se la spawnl funziona come spero, potrebbe andare benone.

Unica cosa... Io programma in C. Lo so che nel titolo del topic stà [C\C++], ma in effetti nel mio programma c'è solo il C (e vorrei rimanesse solo lui).

La spawnl funziona lo stesso?

Per dire, posso evitare di scrivere cose come

using mainspace std

oppure sono indispensabili?
Zero-Giulio è offline   Rispondi citando il messaggio o parte di esso
Old 05-04-2009, 18:57   #7
_Claudio
Senior Member
 
L'Avatar di _Claudio
 
Iscritto dal: Aug 2005
Messaggi: 579
Quote:
Originariamente inviato da Zero-Giulio Guarda i messaggi
Proverò con la spawnl.

Se non funziona, beh... Lascio così com'è...

Alla fine il programma non devo mandarlo in giro. Serve solo a me. E io posso benissimo fare tutto a mano, tanto sono solo un apio di click.

Certo però che se la spawnl funziona come spero, potrebbe andare benone.

Unica cosa... Io programma in C. Lo so che nel titolo del topic stà [C\C++], ma in effetti nel mio programma c'è solo il C (e vorrei rimanesse solo lui).

La spawnl funziona lo stesso?

Per dire, posso evitare di scrivere cose come

using mainspace std

oppure sono indispensabili?
spawnl è una funzione di libreria, quindi puoi chiamarla tranquillamente sia con C che con C++...
http://msdn.microsoft.com/en-us/libr...sc(VS.80).aspx

In caso usi codice gestito (.net) allora
http://msdn.microsoft.com/en-us/libr...ss(VS.80).aspx

Anche se non vi è alcun riferimento circa la possibilità di controllare l'evoluzione del processo lanciato a meno di accedere al codice del processo.
_Claudio è offline   Rispondi citando il messaggio o parte di esso
Old 05-04-2009, 23:27   #8
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
Quote:
Originariamente inviato da Zero-Giulio Guarda i messaggi
Proverò con la spawnl.

Se non funziona, beh... Lascio così com'è...

...

Unica cosa... Io programma in C. Lo so che nel titolo del topic stà [C\C++], ma in effetti nel mio programma c'è solo il C (e vorrei rimanesse solo lui).

La spawnl funziona lo stesso?
Come t'ha gia' scritto _Claudio, certamente ...

Stesso esempio ri-scritto strettamente in C

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

int main(int argc, char *argv[])
{
    //stampa "inizio"
    printf("inizio\n");

    //lancia "notepad.exe" ... e ne attende la chiusura...
    _spawnl( _P_WAIT, "c:/windows/notepad.exe", NULL );

    //stampa fine... dopo la chiusura di notepad
    printf("fine\n");
    return 0;
}
Come vedi la chiamata a spawn e' rimasta invariata.

Unica cosa... il controllo dei processi e' legato al sistema operativo, per cui la spawn non la troverai nei sistemi unix-like (Linux, FreeBSD, MacOSX, etc...).
In tal caso dovrai gestire la cosa attraverso fork(), execv(...) e waitpid(...).
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 11-04-2009, 17:35   #9
Zero-Giulio
Member
 
Iscritto dal: May 2007
Messaggi: 292
Ho finalmente inserito la _spawnl nel mio codice, facendo girare il tutto. Che dire... Sembra andare bene.

Fa quello che volevo facesse: mette in pausa il programma "padre", chiama il programma "figlio", lo porta a termine, e infine riprende il padre da dove l'aveva lasciato.

Qualche domanda...

1 - con la _spawnl, così come l'ho scritta io, tutto viene fatto girare su una stessa finestra di comando. Poichè io vorrei arrivare ad annidazioni anche molto profonde, ciascuna con molte righe di output che mando su schermo, mi piacerebbe che ogni volta che la _spawnl chiama un nuovo processo, questo venisse aperto su una shella diversa. Si può fare a costo zero? Non è un'esigenza fondamentale, potrei sempre ridirigere l'output su un file, anzicche sullo schermo. Ma se fosse possibile aprire processi su finestre separate mi piacerebbe. Naturalmente a costo zero, o quasi, nel senso che se si, si può fare, ma è macchinoso, lascio perdere e ci rinuncio.

2 - cosa posso controllare per essere sicuro che tutto vada bene? Chessò, è possibile che magari il sistema faccia confusione e vada amischiare le variabili relative ai due processi. Considerate che con la _spawnl io chiamo lo stesso programma. In sostanza ho un eseguibile, pippo.exe, che copio n volte (p1.exe, p2.exe, ..., pn.exe), e poi da dentro p(i-1).exe chiamo pi.exe ciclicamente, fino a i=n. Ci sono rischi? C'è qualche controllo che posso fare?
Zero-Giulio è offline   Rispondi citando il messaggio o parte di esso
Old 11-04-2009, 20:46   #10
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
Cio' che mi viene in mente e' usare il comando "START" per aprire un programma in un'altra finestra.

E devi anche usare l'opzione /WAIT affinche' la finestra non venga aperta in modo asincorono.

Oltretutto essendo "START" un comando di cmd.exe, e non un programma, per poterlo utilizzare devi quindi chiamare cmd.exe a sua volta con l'opzione /c

Insomma la spawn verrebbe:

_spawnl( _P_WAIT, "c:/windows/system32/cmd.exe", "/c", "start", "/wait", "c:/windows/system32/ping.exe", "192.168.0.1", NULL );

In questo esempio apro il comando "ping 192.168.0.1" in un'altra finestra.
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 14-04-2009, 14:55   #11
Zero-Giulio
Member
 
Iscritto dal: May 2007
Messaggi: 292
Ho scoperto, con mia somma gioia, che il super computer dell'ateneo dove dovrei far girare il programma ha la Mandriva, non Windows.

In pratica devo compilare il codice sotto lunix.

Essendo scritto quasi interamente in Ansi C, immagino non avrò problemi, eccetto per la riga di codice di questo thread (da cui il "quasi interamente").

In sostanza, per il debug a casa ho windows e posso continuare a usare il vecchio codice (con la _spawnl), mentre per le run vere all'ateneo dovrei sostituire quella riga con fork ()-wait () ecc...

Volevo chiedervi, approfittando delle vostra competenza e disponibilità, se potevate farmi un esempio del tutto analogo in linux.

Per intenderci, io nel codice di adesso ho

Quote:
#include <process.h>

_spawnl (_P_WAIT, progr_name, input_file_name, NULL);
dove progr_name e input_file_name sono due stringhe.

Cosa scrivere in linux?

Mi piacerebbe avere un esempio. So che esistono le documentazioni, ma "imparare" qualcosa direttamente su di loro lo trovo difficile. Sarà che non sono un programmatore.

Preferirei avere un esempio, così per chiarire il funzionamento, e poi eventualmente approfondire sulla documentazione una volta chiarite le idee.

Grazie :-)
Zero-Giulio è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Telecamere Reolink 4K su Amazon: Wi-Fi 6...
Anthropic vuole farsi i chip da sola? Co...
Il fondatore di Framework: il personal c...
JBL Live Flex 3 a 129€ su Amazon: ANC ad...
Come un uomo ha costruito un'azienda da ...
Multe fino a 400 euro anche se hai pagat...
Tapo lancia una valanga di offerte su Am...
Little Snitch su Linux: finalmente dispo...
John Deere accetta un accordo da 99 mili...
Gli astronauti di Artemis II osservano i...
OpenAI lancia ChatGPT Pro da 100 dollari...
Allarme rosso: CPU-Z e HWMonitor, segnal...
Arriva su Instagram la funzione per modi...
Le offerte del mondo Apple: iPhone 17 e ...
Italia sotto assedio: il settore governa...
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:37.


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