Page 3 of 3

Re: Απορίες σε απλά πραγματάκια σε C++

Posted: Mon Jan 26, 2009 6:01 pm
by para
Επιμένει να χτυπάει η fork() και μαζί της η getpid()...
(και η sleep(), αλλά την κανονίζω αυτή :ρ)

Καμιά ιδέα να αναγνωρίσει τη fork(); :-(

Re: Απορίες σε απλά πραγματάκια σε C++

Posted: Mon Jan 26, 2009 6:05 pm
by gasparosoft
Πάντως καλό θα ήταν να μην προτιμάτε να χρησιμοποιήτε την system. Καλύτερα θα ήταν η execl , execv κτλ που βρίσκονται στο unistd.h. Επίσης με το fork να προσέχεις γιατί μπορείς να οδηγηθείς σε zombie process ή να τελειώσει την εκτέλεση πρώτα ο parent και ύστερα το child process. Στην τελευταία περίπτωση χρησιμοποιείς την wait(sys/wait.h) στο parent process , ενώ στην πρώτη περίπτωση χρησιμοποιείς την waitpid(sys/wait.h) και είσαι μια χαρά.

Για να χρησιμοποιήσεις την fork κάνε include unistd.h και sys/types.h

Re: Απορίες σε απλά πραγματάκια σε C++

Posted: Mon Jan 26, 2009 6:18 pm
by para
Ευχαριστώ για τις συμβουλές! Έχω σκοπό να κάνω kill τις διεργασίες πριν τελειώσουν οπότε δε νομίζω να αντιμετωπίσω πρόβλημα με τη σειρά με την οποία τελειώνουν.

Έχω κάνει ό,τι include υπάρχει αλλά τίποτα!!
Για έσχατη λύση, μήπως να απεγκαταστήσω κ εγκαταστήσω πάλι απ' την αρχή κάτι; (και τι;!)

Re: Απορίες σε απλά πραγματάκια σε C++

Posted: Mon Jan 26, 2009 8:49 pm
by netharis
para wrote: Έχω κάνει ό,τι include υπάρχει αλλά τίποτα!!
Για έσχατη λύση, μήπως να απεγκαταστήσω κ εγκαταστήσω πάλι απ' την αρχή κάτι; (και τι;!)
Σε τι compiler δουλεύεις, και τι ακριβώς θες να κάνεις;

Re: Απορίες σε απλά πραγματάκια σε C++

Posted: Mon Jan 26, 2009 9:06 pm
by para
g++ (αυτό γράφει τουλάχιστον το Dev-C++, εκτός αν έχω μετονομάσει τον default!)

Αυτό που θέλω είναι στην αρχή ο κώδικας να ανοίγει 10 προγράμματα ταυτόχρονα, και να συνεχίσει να εκτελείται χωρίς να περιμένει να ολοκληρωθούν αυτά.

//Και δε μου αναγνωρίζεται η fork() :-p

Re: Απορίες σε απλά πραγματάκια σε C++

Posted: Tue Jan 27, 2009 4:23 am
by netharis
Α, σε Windows είσαι.
Σε συστήματα εκτός του *ΝΙΧ δεν υπάρχει η έννοια του process id όπως υπάρχει στο Unix, καθώς και του fork().
Δουλεύουν εντελώς ξεχωριστά. Στα windows, μία διεργασία έχει το δικό της adress space.
Σε *NIX συστήματα μία forked process, "κληρονομεί" ουσιαστικά το χώρο στην εικονική μνήμη (code, data, stack), περιγραφείς, νήματα κτλ.
Σε μια εφαρμογή windows, αυτό είναι πρακτικά αδύνατο (δεν έχω ακούσει κανέναν να μπόρεσε να κάνει ακριβές Port της fork σε Windows).
Mπορείς να κάνεις μία κλήση στην CreateProcess() του win32 API, αλλα δεν κάνει αυτό που κάνει η fork.
Mία κλήση στη fork θα ξεκινήσει ως νέο process απο το σημείο που κλήθηκε, ενώ η CreateProcess ξεκινάει την εκτέλεση απο την αρχή.
Μια προσέγγιση είναι όπως είπαν τα παιδιά το multi-threading.
Έχουμε ξαναπεί οτι υπάρχουν πολλές έτοιμες βιβλιοθήκες για αυτό. Εδώ είναι up to you τι θα χρησιμοποιήσεις (αν χρειάζεσαι scoping για να έχεις κοινή μνήμη).
Mια άλλη λύση είναι να παίξεις (ακόμα μια φορά :-p ) με το API των Windows για multitasking (βαθμός δυσκολίας ++ ).
Ίσως να έχουμε καλύτερες προτάσεις αν μας πείς τι ακριβώς θες να κάνεις.
Aυτά :-p
Εxtra:
Μπορείς να πάρεις το Process ID ενός thread προγραμματιστικά κάνοντας μία κλήση στη GetProcessId() του win32 API.

Re: Απορίες σε απλά πραγματάκια σε C++

Posted: Tue Jan 27, 2009 4:32 am
by para
Είναι εξαιρετικά απλό (σε φυσική γλώσσα-ψευδοψευδοψευδοκωδικα :ρ) αυτό που θέλω να κάνω:

Code: Select all

for (i=1->10) ανοιξε το προγραμμα bla.exe;
Sleep(10000);
kill bla.exe //τα κλεινει και τα 10
να σημειώσω ότι θέλω την ώρα που τρέχουν τα bla.exe να προχωράει ο κώδικας. Δηλαδή τα 10000ms να είναι απ' τη στιγμή που άρχισε το τελευταίο bla.exe. Και φυσικά τα 10 προγράμματα να άνοιξαν -όσο μπορούν- ταυτόχρονα.

Re: Απορίες σε απλά πραγματάκια σε C++

Posted: Tue Jan 27, 2009 4:56 am
by netharis
Άρα μιλάς για μία άλλη εφαρμογή, και όχι αυτή την οποία θες να φτιάξεις.
Σε αυτή τη περίπτωση, μπορείς να χρησιμοποιήσεις την spawnlp()

Code: Select all

#include <process.h>
#include <windows.h>
#include <iostream>

using namespace std;

int main()
{
      for(int i = 0; i < 10; i++)
      {
           _spawnlp(P_NOWAIT, "foo.exe", NULL); //Στη θέση του null μπαίνει ένα array ως μεταβλητή περιβάλλοντος
           Sleep(10000);
       }
        
       return 0; //Με το τέλος του προγράμματος κλείνουν όλα τα spawned process
}   

Re: Απορίες σε απλά πραγματάκια σε C++

Posted: Tue Jan 27, 2009 5:10 am
by para
Κανονικά αυτή που θέλω να φτιάξω θέλω να τρέξω αλλά αν είναι τόσο ζόρι μπορώ να φτιάξω δύο και η μία να τρέχει την άλλη. Γι' αυτό και τώρα το είπα σαν να είναι δύο.

Με αυτό το array τι ακριβώς κάνω; Δεν ξέρω σε βάθος πράγματα και δυσκολεύομαι να καταλάβω.. (δεν ξέρω δλδ τι σημαίνει μεταβλητή περιβάλλοντος)

Code: Select all

      for(int i = 0; i < 10; i++)  _spawnlp(P_NOWAIT, "foo.exe", NULL); //Στη θέση του null μπαίνει ένα array ως μεταβλητή περιβάλλοντος

       Sleep(10000); 
       return 0; //Με το τέλος του προγράμματος κλείνουν όλα τα spawned process
Άρα, αν κατάλαβα καλά, με το τέλος του προγράμματος θα γίνουν killed όλες οι foo.exe (όπου κι αν βρίσκονται στην εκτέλεσή τους).

Re: Απορίες σε απλά πραγματάκια σε C++

Posted: Tue Jan 27, 2009 5:18 am
by netharis
Βασικά έκανα λάθος πριν, δεν περνάς μεταβλητές περιβάλλοντος, απλά παράμετρους στο εκτελέσιμο.
Και ναι, ως spawned διεργασίες θα γίνουν Kill μετά το πέρας του προγραμματος.
Αυτό που πρέπει να έχεις υπόψη σου είναι ότι γίνεται κάποιο είδος piping, ανάμεσα στην εφαρμογή σου και την spawned.
Δεν θα ανοίξει δηλαδή νέο παράθυρο, απλά θα σωληνωθεί στο prompt του δικού σου εκτελέσιμου (αλλά θα υπάρχει σαν διεργασία).
Τώρα αν θες σε νέο παράθυρο, υπάρχουν άλλα κόλπα (πιο επιφανειακά ίσως) π.χ ShellExecute.
Υπάρχουν πολλοί τρόποι να κάνεις αυτό που θες, απλά πρέπει να επιλέξεις το πιο σωστό και αποδοτικό ;)
Spoiler: εμφάνιση/απόκρυψη
Μήπως να μετονομάσουμε το όνομα του topic; Πήρε άλλη έκταση :lol: Ι'm off :smt015

Re: Απορίες σε απλά πραγματάκια σε C++

Posted: Tue Jan 27, 2009 5:22 am
by para
Αυτό γινόταν μέχρι τώρα και δε με πειράζει να γίνεται έτσι. Αρκεί να γίνεται κάτι (γιατί δεν είδα να κινείται τίποτα! μόνο το sleep() εκτελέστηκε; οΟ).

Μη σε κουράζω άλλο, θα το ψάξω λίγο ακόμα αν όντως τελικά δεν κινείται τίποτα.