Απορίες σε απλά πραγματάκια σε C++
- para
- Wow! Terabyte level
- Posts: 3648
- Joined: Sat Nov 04, 2006 2:59 am
- Academic status: Alumnus/a
- Gender: ♂
Re: Απορίες σε απλά πραγματάκια σε C++
Επιμένει να χτυπάει η fork() και μαζί της η getpid()...
(και η sleep(), αλλά την κανονίζω αυτή :ρ)
Καμιά ιδέα να αναγνωρίσει τη fork();
(και η sleep(), αλλά την κανονίζω αυτή :ρ)
Καμιά ιδέα να αναγνωρίσει τη fork();
Γύρνα είμαι ένα άψυχο κορμί που σ' αγαπάει, αισθάνομαι στον άνεμο φτερό
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
#!
Κοίτα πως με κατάντησε η δική σου η αγάπη, να μη γνωρίζω από που να κρατηθώ
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
- gasparosoft
- Gbyte level
- Posts: 1920
- Joined: Fri Oct 19, 2007 8:03 pm
Re: Απορίες σε απλά πραγματάκια σε C++
Πάντως καλό θα ήταν να μην προτιμάτε να χρησιμοποιήτε την 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
Για να χρησιμοποιήσεις την fork κάνε include unistd.h και sys/types.h
- para
- Wow! Terabyte level
- Posts: 3648
- Joined: Sat Nov 04, 2006 2:59 am
- Academic status: Alumnus/a
- Gender: ♂
Re: Απορίες σε απλά πραγματάκια σε C++
Ευχαριστώ για τις συμβουλές! Έχω σκοπό να κάνω kill τις διεργασίες πριν τελειώσουν οπότε δε νομίζω να αντιμετωπίσω πρόβλημα με τη σειρά με την οποία τελειώνουν.
Έχω κάνει ό,τι include υπάρχει αλλά τίποτα!!
Για έσχατη λύση, μήπως να απεγκαταστήσω κ εγκαταστήσω πάλι απ' την αρχή κάτι; (και τι;!)
Έχω κάνει ό,τι include υπάρχει αλλά τίποτα!!
Για έσχατη λύση, μήπως να απεγκαταστήσω κ εγκαταστήσω πάλι απ' την αρχή κάτι; (και τι;!)
Γύρνα είμαι ένα άψυχο κορμί που σ' αγαπάει, αισθάνομαι στον άνεμο φτερό
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
#!
Κοίτα πως με κατάντησε η δική σου η αγάπη, να μη γνωρίζω από που να κρατηθώ
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
- 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++
Σε τι compiler δουλεύεις, και τι ακριβώς θες να κάνεις;para wrote: Έχω κάνει ό,τι include υπάρχει αλλά τίποτα!!
Για έσχατη λύση, μήπως να απεγκαταστήσω κ εγκαταστήσω πάλι απ' την αρχή κάτι; (και τι;!)
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."
- para
- Wow! Terabyte level
- Posts: 3648
- Joined: Sat Nov 04, 2006 2:59 am
- Academic status: Alumnus/a
- Gender: ♂
Re: Απορίες σε απλά πραγματάκια σε C++
g++ (αυτό γράφει τουλάχιστον το Dev-C++, εκτός αν έχω μετονομάσει τον default!)
Αυτό που θέλω είναι στην αρχή ο κώδικας να ανοίγει 10 προγράμματα ταυτόχρονα, και να συνεχίσει να εκτελείται χωρίς να περιμένει να ολοκληρωθούν αυτά.
//Και δε μου αναγνωρίζεται η fork()
Αυτό που θέλω είναι στην αρχή ο κώδικας να ανοίγει 10 προγράμματα ταυτόχρονα, και να συνεχίσει να εκτελείται χωρίς να περιμένει να ολοκληρωθούν αυτά.
//Και δε μου αναγνωρίζεται η fork()
Γύρνα είμαι ένα άψυχο κορμί που σ' αγαπάει, αισθάνομαι στον άνεμο φτερό
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
#!
Κοίτα πως με κατάντησε η δική σου η αγάπη, να μη γνωρίζω από που να κρατηθώ
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
- 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++
Α, σε 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ια άλλη λύση είναι να παίξεις (ακόμα μια φορά ) με το API των Windows για multitasking (βαθμός δυσκολίας ++ ).
Ίσως να έχουμε καλύτερες προτάσεις αν μας πείς τι ακριβώς θες να κάνεις.
Aυτά
Εxtra:
Μπορείς να πάρεις το Process ID ενός thread προγραμματιστικά κάνοντας μία κλήση στη GetProcessId() του win32 API.
Σε συστήματα εκτός του *ΝΙΧ δεν υπάρχει η έννοια του 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ια άλλη λύση είναι να παίξεις (ακόμα μια φορά ) με το API των Windows για multitasking (βαθμός δυσκολίας ++ ).
Ίσως να έχουμε καλύτερες προτάσεις αν μας πείς τι ακριβώς θες να κάνεις.
Aυτά
Εxtra:
Μπορείς να πάρεις το Process ID ενός thread προγραμματιστικά κάνοντας μία κλήση στη GetProcessId() του win32 API.
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."
- para
- Wow! Terabyte level
- Posts: 3648
- Joined: Sat Nov 04, 2006 2:59 am
- Academic status: Alumnus/a
- Gender: ♂
Re: Απορίες σε απλά πραγματάκια σε C++
Είναι εξαιρετικά απλό (σε φυσική γλώσσα-ψευδοψευδοψευδοκωδικα :ρ) αυτό που θέλω να κάνω:
να σημειώσω ότι θέλω την ώρα που τρέχουν τα bla.exe να προχωράει ο κώδικας. Δηλαδή τα 10000ms να είναι απ' τη στιγμή που άρχισε το τελευταίο bla.exe. Και φυσικά τα 10 προγράμματα να άνοιξαν -όσο μπορούν- ταυτόχρονα.
Code: Select all
for (i=1->10) ανοιξε το προγραμμα bla.exe;
Sleep(10000);
kill bla.exe //τα κλεινει και τα 10
Γύρνα είμαι ένα άψυχο κορμί που σ' αγαπάει, αισθάνομαι στον άνεμο φτερό
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
#!
Κοίτα πως με κατάντησε η δική σου η αγάπη, να μη γνωρίζω από που να κρατηθώ
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
- 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++
Άρα μιλάς για μία άλλη εφαρμογή, και όχι αυτή την οποία θες να φτιάξεις.
Σε αυτή τη περίπτωση, μπορείς να χρησιμοποιήσεις την spawnlp()
Σε αυτή τη περίπτωση, μπορείς να χρησιμοποιήσεις την 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
}
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."
- para
- Wow! Terabyte level
- Posts: 3648
- Joined: Sat Nov 04, 2006 2:59 am
- Academic status: Alumnus/a
- Gender: ♂
Re: Απορίες σε απλά πραγματάκια σε C++
Κανονικά αυτή που θέλω να φτιάξω θέλω να τρέξω αλλά αν είναι τόσο ζόρι μπορώ να φτιάξω δύο και η μία να τρέχει την άλλη. Γι' αυτό και τώρα το είπα σαν να είναι δύο.
Με αυτό το array τι ακριβώς κάνω; Δεν ξέρω σε βάθος πράγματα και δυσκολεύομαι να καταλάβω.. (δεν ξέρω δλδ τι σημαίνει μεταβλητή περιβάλλοντος)
Άρα, αν κατάλαβα καλά, με το τέλος του προγράμματος θα γίνουν killed όλες οι foo.exe (όπου κι αν βρίσκονται στην εκτέλεσή τους).
Με αυτό το 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
Γύρνα είμαι ένα άψυχο κορμί που σ' αγαπάει, αισθάνομαι στον άνεμο φτερό
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
#!
Κοίτα πως με κατάντησε η δική σου η αγάπη, να μη γνωρίζω από που να κρατηθώ
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
- 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++
Βασικά έκανα λάθος πριν, δεν περνάς μεταβλητές περιβάλλοντος, απλά παράμετρους στο εκτελέσιμο.
Και ναι, ως spawned διεργασίες θα γίνουν Kill μετά το πέρας του προγραμματος.
Αυτό που πρέπει να έχεις υπόψη σου είναι ότι γίνεται κάποιο είδος piping, ανάμεσα στην εφαρμογή σου και την spawned.
Δεν θα ανοίξει δηλαδή νέο παράθυρο, απλά θα σωληνωθεί στο prompt του δικού σου εκτελέσιμου (αλλά θα υπάρχει σαν διεργασία).
Τώρα αν θες σε νέο παράθυρο, υπάρχουν άλλα κόλπα (πιο επιφανειακά ίσως) π.χ ShellExecute.
Υπάρχουν πολλοί τρόποι να κάνεις αυτό που θες, απλά πρέπει να επιλέξεις το πιο σωστό και αποδοτικό
Και ναι, ως spawned διεργασίες θα γίνουν Kill μετά το πέρας του προγραμματος.
Αυτό που πρέπει να έχεις υπόψη σου είναι ότι γίνεται κάποιο είδος piping, ανάμεσα στην εφαρμογή σου και την spawned.
Δεν θα ανοίξει δηλαδή νέο παράθυρο, απλά θα σωληνωθεί στο prompt του δικού σου εκτελέσιμου (αλλά θα υπάρχει σαν διεργασία).
Τώρα αν θες σε νέο παράθυρο, υπάρχουν άλλα κόλπα (πιο επιφανειακά ίσως) π.χ ShellExecute.
Υπάρχουν πολλοί τρόποι να κάνεις αυτό που θες, απλά πρέπει να επιλέξεις το πιο σωστό και αποδοτικό
- Spoiler: εμφάνιση/απόκρυψη
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."
- para
- Wow! Terabyte level
- Posts: 3648
- Joined: Sat Nov 04, 2006 2:59 am
- Academic status: Alumnus/a
- Gender: ♂
Re: Απορίες σε απλά πραγματάκια σε C++
Αυτό γινόταν μέχρι τώρα και δε με πειράζει να γίνεται έτσι. Αρκεί να γίνεται κάτι (γιατί δεν είδα να κινείται τίποτα! μόνο το sleep() εκτελέστηκε; οΟ).
Μη σε κουράζω άλλο, θα το ψάξω λίγο ακόμα αν όντως τελικά δεν κινείται τίποτα.
Μη σε κουράζω άλλο, θα το ψάξω λίγο ακόμα αν όντως τελικά δεν κινείται τίποτα.
Γύρνα είμαι ένα άψυχο κορμί που σ' αγαπάει, αισθάνομαι στον άνεμο φτερό
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
Σαν μέσα σε όνειρο η ζωή με προσπερνάει, δείξε μου οίκτο μια στιγμή παρακαλώ...
#!
Κοίτα πως με κατάντησε η δική σου η αγάπη, να μη γνωρίζω από που να κρατηθώ
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...
Στο τελευταίο της ζωής το σκαλοπάτι, Γύρνα, είμαι ένα βήμα απ' το γκρεμό...