Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media
Nel Formula 1 Technology and Media Centre di Biggin Hill, la velocità delle monoposto si trasforma in dati, immagini e decisioni in tempo reale grazie all’infrastruttura Lenovo che gestisce centinaia di terabyte ogni weekend di gara e collega 820 milioni di spettatori nel mondo
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
Il nuovo gimbal mobile DJI evolve il concetto di tracciamento automatico con tre modalità diverse, un modulo multifunzionale con illuminazione integrata e controlli gestuali avanzati. Nel gimbal è anche presente un'asta telescopica da 215 mm con treppiede integrato, per un prodotto completo per content creator di ogni livello
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-04-2009, 15: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, 15: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, 22: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, 23: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 23:37.
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2009, 18: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, 14: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, 19: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 06-04-2009, 00: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, 18: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, 21: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, 15: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


Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce Recensione Pura 80 Pro: HUAWEI torna a stupire c...
Opera Neon: il browser AI agentico di nuova generazione Opera Neon: il browser AI agentico di nuova gene...
I 6 migliori smartphone da acquistare su...
iPhone Air 2 è già in cant...
OnePlus 15, in Europa sarà uguale...
Portal X, un nuovo modo per controllare ...
Con Satispay ora si può pagare in...
Sora sbarca anche su Android: una nuova ...
Vibes sbarca in Europa: Meta sfida TikTo...
Tesla, approvato il pacchetto da 1.000 m...
Rockstar posticipa GTA 6 a novembre 2026...
Snap e Perplexity unite: dal prossimo an...
La Cina dice addio a NVIDIA? Il governo ...
Microlino, simbolo italiano della mobili...
Apple disattiverà la sincronizzaz...
Google lancia l'allarme: attenzione ai m...
Primo test drive con Leapmotor B10: le c...
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: 07:18.


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