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

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
User avatar
para
Wow! Terabyte level
Wow! Terabyte level
Posts: 3648
Joined: Sat Nov 04, 2006 2:59 am
Academic status: Alumnus/a
Gender:

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

Post by para » Mon Jan 26, 2009 6:01 pm

Επιμένει να χτυπάει η fork() και μαζί της η getpid()...
(και η sleep(), αλλά την κανονίζω αυτή :ρ)

Καμιά ιδέα να αναγνωρίσει τη fork(); :-(
Γύρνα είμαι ένα άψυχο κορμί που σ' αγαπάει, αισθάνομαι στον άνεμο φτερό
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
#!
Κοίτα πως με κατάντησε η δική σου η αγάπη, να μη γνωρίζω από που να κρατηθώ
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
User avatar
gasparosoft
Gbyte level
Gbyte level
Posts: 1920
Joined: Fri Oct 19, 2007 8:03 pm

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

Post by gasparosoft » Mon Jan 26, 2009 6:05 pm

Πάντως καλό θα ήταν να μην προτιμάτε να χρησιμοποιήτε την 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
User avatar
para
Wow! Terabyte level
Wow! Terabyte level
Posts: 3648
Joined: Sat Nov 04, 2006 2:59 am
Academic status: Alumnus/a
Gender:

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

Post by para » Mon Jan 26, 2009 6:18 pm

Ευχαριστώ για τις συμβουλές! Έχω σκοπό να κάνω kill τις διεργασίες πριν τελειώσουν οπότε δε νομίζω να αντιμετωπίσω πρόβλημα με τη σειρά με την οποία τελειώνουν.

Έχω κάνει ό,τι include υπάρχει αλλά τίποτα!!
Για έσχατη λύση, μήπως να απεγκαταστήσω κ εγκαταστήσω πάλι απ' την αρχή κάτι; (και τι;!)
Γύρνα είμαι ένα άψυχο κορμί που σ' αγαπάει, αισθάνομαι στον άνεμο φτερό
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
#!
Κοίτα πως με κατάντησε η δική σου η αγάπη, να μη γνωρίζω από που να κρατηθώ
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
User avatar
netharis
Venus Former Team Member
Posts: 1845
Joined: Sun Jul 15, 2007 2:37 pm
Academic status: Alumnus/a
Gender:
Location: Seattle, Washington
Contact:

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

Post by netharis » Mon Jan 26, 2009 8:49 pm

para wrote: Έχω κάνει ό,τι include υπάρχει αλλά τίποτα!!
Για έσχατη λύση, μήπως να απεγκαταστήσω κ εγκαταστήσω πάλι απ' την αρχή κάτι; (και τι;!)
Σε τι compiler δουλεύεις, και τι ακριβώς θες να κάνεις;
Image
Resistance is futile. Join the foss-side now!
"UNIX is very simple, it just needs a genius to understand its simplicity." - Dennis Ritchie
"The things that I want, by Max Payne. A smoke. A whiskey. For the sun to shine. I want to sleep, to forget. To change the past. Unlimited ammo and a license to kill. But right then, more than anything, I wanted her."
User avatar
para
Wow! Terabyte level
Wow! Terabyte level
Posts: 3648
Joined: Sat Nov 04, 2006 2:59 am
Academic status: Alumnus/a
Gender:

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

Post by para » Mon Jan 26, 2009 9:06 pm

g++ (αυτό γράφει τουλάχιστον το Dev-C++, εκτός αν έχω μετονομάσει τον default!)

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

//Και δε μου αναγνωρίζεται η fork() :-p
Γύρνα είμαι ένα άψυχο κορμί που σ' αγαπάει, αισθάνομαι στον άνεμο φτερό
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
#!
Κοίτα πως με κατάντησε η δική σου η αγάπη, να μη γνωρίζω από που να κρατηθώ
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
User avatar
netharis
Venus Former Team Member
Posts: 1845
Joined: Sun Jul 15, 2007 2:37 pm
Academic status: Alumnus/a
Gender:
Location: Seattle, Washington
Contact:

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

Post by netharis » Tue Jan 27, 2009 4:23 am

Α, σε 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.
Image
Resistance is futile. Join the foss-side now!
"UNIX is very simple, it just needs a genius to understand its simplicity." - Dennis Ritchie
"The things that I want, by Max Payne. A smoke. A whiskey. For the sun to shine. I want to sleep, to forget. To change the past. Unlimited ammo and a license to kill. But right then, more than anything, I wanted her."
User avatar
para
Wow! Terabyte level
Wow! Terabyte level
Posts: 3648
Joined: Sat Nov 04, 2006 2:59 am
Academic status: Alumnus/a
Gender:

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

Post by para » Tue Jan 27, 2009 4:32 am

Είναι εξαιρετικά απλό (σε φυσική γλώσσα-ψευδοψευδοψευδοκωδικα :ρ) αυτό που θέλω να κάνω:

Code: Select all

for (i=1->10) ανοιξε το προγραμμα bla.exe;
Sleep(10000);
kill bla.exe //τα κλεινει και τα 10
να σημειώσω ότι θέλω την ώρα που τρέχουν τα bla.exe να προχωράει ο κώδικας. Δηλαδή τα 10000ms να είναι απ' τη στιγμή που άρχισε το τελευταίο bla.exe. Και φυσικά τα 10 προγράμματα να άνοιξαν -όσο μπορούν- ταυτόχρονα.
Γύρνα είμαι ένα άψυχο κορμί που σ' αγαπάει, αισθάνομαι στον άνεμο φτερό
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
#!
Κοίτα πως με κατάντησε η δική σου η αγάπη, να μη γνωρίζω από που να κρατηθώ
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
User avatar
netharis
Venus Former Team Member
Posts: 1845
Joined: Sun Jul 15, 2007 2:37 pm
Academic status: Alumnus/a
Gender:
Location: Seattle, Washington
Contact:

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

Post by netharis » Tue Jan 27, 2009 4:56 am

Άρα μιλάς για μία άλλη εφαρμογή, και όχι αυτή την οποία θες να φτιάξεις.
Σε αυτή τη περίπτωση, μπορείς να χρησιμοποιήσεις την 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
}   
Image
Resistance is futile. Join the foss-side now!
"UNIX is very simple, it just needs a genius to understand its simplicity." - Dennis Ritchie
"The things that I want, by Max Payne. A smoke. A whiskey. For the sun to shine. I want to sleep, to forget. To change the past. Unlimited ammo and a license to kill. But right then, more than anything, I wanted her."
User avatar
para
Wow! Terabyte level
Wow! Terabyte level
Posts: 3648
Joined: Sat Nov 04, 2006 2:59 am
Academic status: Alumnus/a
Gender:

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

Post by para » Tue Jan 27, 2009 5:10 am

Κανονικά αυτή που θέλω να φτιάξω θέλω να τρέξω αλλά αν είναι τόσο ζόρι μπορώ να φτιάξω δύο και η μία να τρέχει την άλλη. Γι' αυτό και τώρα το είπα σαν να είναι δύο.

Με αυτό το 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 (όπου κι αν βρίσκονται στην εκτέλεσή τους).
Γύρνα είμαι ένα άψυχο κορμί που σ' αγαπάει, αισθάνομαι στον άνεμο φτερό
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
#!
Κοίτα πως με κατάντησε η δική σου η αγάπη, να μη γνωρίζω από που να κρατηθώ
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
User avatar
netharis
Venus Former Team Member
Posts: 1845
Joined: Sun Jul 15, 2007 2:37 pm
Academic status: Alumnus/a
Gender:
Location: Seattle, Washington
Contact:

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

Post by netharis » Tue Jan 27, 2009 5:18 am

Βασικά έκανα λάθος πριν, δεν περνάς μεταβλητές περιβάλλοντος, απλά παράμετρους στο εκτελέσιμο.
Και ναι, ως spawned διεργασίες θα γίνουν Kill μετά το πέρας του προγραμματος.
Αυτό που πρέπει να έχεις υπόψη σου είναι ότι γίνεται κάποιο είδος piping, ανάμεσα στην εφαρμογή σου και την spawned.
Δεν θα ανοίξει δηλαδή νέο παράθυρο, απλά θα σωληνωθεί στο prompt του δικού σου εκτελέσιμου (αλλά θα υπάρχει σαν διεργασία).
Τώρα αν θες σε νέο παράθυρο, υπάρχουν άλλα κόλπα (πιο επιφανειακά ίσως) π.χ ShellExecute.
Υπάρχουν πολλοί τρόποι να κάνεις αυτό που θες, απλά πρέπει να επιλέξεις το πιο σωστό και αποδοτικό ;)
Spoiler: εμφάνιση/απόκρυψη
Μήπως να μετονομάσουμε το όνομα του topic; Πήρε άλλη έκταση :lol: Ι'm off :smt015
Image
Resistance is futile. Join the foss-side now!
"UNIX is very simple, it just needs a genius to understand its simplicity." - Dennis Ritchie
"The things that I want, by Max Payne. A smoke. A whiskey. For the sun to shine. I want to sleep, to forget. To change the past. Unlimited ammo and a license to kill. But right then, more than anything, I wanted her."
User avatar
para
Wow! Terabyte level
Wow! Terabyte level
Posts: 3648
Joined: Sat Nov 04, 2006 2:59 am
Academic status: Alumnus/a
Gender:

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

Post by para » Tue Jan 27, 2009 5:22 am

Αυτό γινόταν μέχρι τώρα και δε με πειράζει να γίνεται έτσι. Αρκεί να γίνεται κάτι (γιατί δεν είδα να κινείται τίποτα! μόνο το sleep() εκτελέστηκε; οΟ).

Μη σε κουράζω άλλο, θα το ψάξω λίγο ακόμα αν όντως τελικά δεν κινείται τίποτα.
Γύρνα είμαι ένα άψυχο κορμί που σ' αγαπάει, αισθάνομαι στον άνεμο φτερό
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
#!
Κοίτα πως με κατάντησε η δική σου η αγάπη, να μη γνωρίζω από που να κρατηθώ
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
Post Reply

Return to “Προγραμματισμός”