Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό medigeek » 13 Ιουν 2011, 21:55

Ωραίο αυτό. Ευχαριστώ :)
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 13 Ιουν 2011, 21:56

:)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό simosx » 13 Ιουν 2011, 22:31

migf1 έγραψε:Μπορεί, αλλά το return δεν κάνει cleanup. Το ANSI standard επιβάλει η main() να τερματίζει με exit() γιατί η exit() κάνει cleanup τυχόν αμέλειες του προγραμματιστή πριν επιστρέψει στο OS (π.χ. κλείνει ανοιχτά αρχεία, καθαρίζει μνήμες, κλπ)


Η return είναι που προκαλεί να κλείσουν ανοιχτά αρχεία, και έχει μεγαλύτερο νόημα σε C++ όπου τα αντικείμενα καλούν τον αποδομητή (destructor) στο return.
Αν εκτελέσεις exit(), τότε η εφαρμογή παύει άμεσα να λειτουργεί.

Για τη διαχείριση της μνήμης, ό,τι μνήμη έχει δεσμευθεί σε ένα πρόγραμμα επιστρέφει στο σύστημα κατά τον τερματισμό. Εξαίρεση είναι όταν η εφαρμογή γίνει ζόμπι.

Δες περισσότερα π.χ. στο http://stackoverflow.com/questions/4614 ... it-in-main

Μπορείς να δώσεις σύνδεσμο προς το ANSI C όπου περιγράφει τα παραπάνω; Υποψιάζομαι ότι η συμπεριφορά της exit() που αναφέρεις σχετίζεται με ιδιαιτερότητα συγκεκριμένων μεταγλωττιστών (π.χ. για ενσωματωμένα συστήματα), και όχι για GCC.

Μπορείς να δοκιμάσεις με ένα πρόγραμμα-δείγμα που ανοίγει αρχεία και δεσμεύει μνήμη. Με μεταγλώττιση με gcc -S μπορείς να δεις τον παραγόμενο κώδικα σε γλώσσα μηχανής, και να εντοπίσεις αν πραγματικά η exit() κάνει κάτι περισσότερο.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 13 Ιουν 2011, 22:44

Δεν το χω πρόχειρο, αλλά μέχρι να το βρω: http://www.geekinterview.com/question_details/30958

simosx έγραψε:
migf1 έγραψε:Μπορεί, αλλά το return δεν κάνει cleanup. Το ANSI standard επιβάλει η main() να τερματίζει με exit() γιατί η exit() κάνει cleanup τυχόν αμέλειες του προγραμματιστή πριν επιστρέψει στο OS (π.χ. κλείνει ανοιχτά αρχεία, καθαρίζει μνήμες, κλπ)


Η return είναι που προκαλεί να κλείσουν ανοιχτά αρχεία, και έχει μεγαλύτερο νόημα σε C++ όπου τα αντικείμενα καλούν τον αποδομητή (destructor) στο return.
Αν εκτελέσεις exit(), τότε η εφαρμογή παύει άμεσα να λειτουργεί.

Για τη διαχείριση της μνήμης, ό,τι μνήμη έχει δεσμευθεί σε ένα πρόγραμμα επιστρέφει στο σύστημα κατά τον τερματισμό. Εξαίρεση είναι όταν η εφαρμογή γίνει ζόμπι.

Δες περισσότερα π.χ. στο http://stackoverflow.com/questions/4614 ... it-in-main

Μπορείς να δώσεις σύνδεσμο προς το ANSI C όπου περιγράφει τα παραπάνω; Υποψιάζομαι ότι η συμπεριφορά της exit() που αναφέρεις σχετίζεται με ιδιαιτερότητα συγκεκριμένων μεταγλωττιστών (π.χ. για ενσωματωμένα συστήματα), και όχι για GCC.

Μπορείς να δοκιμάσεις με ένα πρόγραμμα-δείγμα που ανοίγει αρχεία και δεσμεύει μνήμη. Με μεταγλώττιση με gcc -S μπορείς να δεις τον παραγόμενο κώδικα σε γλώσσα μηχανής, και να εντοπίσεις αν πραγματικά η exit() κάνει κάτι περισσότερο.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 13 Ιουν 2011, 23:10

Δεν το βρίσκω το ANSI (άσε που δεν θυμάμαι αν είναι στο C89, στο C90 ή στο C99) αλλά βρήκα το σχετικό άρθρο στην Wikipedia: http://en.wikipedia.org/wiki/Exit_%28op ... _system%29 (δες εκεί που λέει cleanup) το οποίο εμφανίζεται όταν πατήσεις το exit link από εδώ: http://en.wikipedia.org/wiki/Stdlib.h.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 13 Ιουν 2011, 23:22

Επίσης, κάνε: man exit στο kubuntu 11.04 (C88 και C99 είναι τελικά ;) )
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό clepto » 14 Ιουν 2011, 01:07

δεν είναι για σχολή, μόλις τελείωσα την πρώτη λυκείου...
ευχαριστώ θα τα κοιτάξω όλα!
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό medigeek » 14 Ιουν 2011, 02:37

Υποθέτω είναι το ίδιο:

http://www.open-std.org/jtc1/sc22/WG14/ ... /n1256.pdf
έγραψε:5.1.2.2.3 Program termination
If the return type of the main function is a type compatible with int, a return from the
initial call to the main function is equivalent to calling the exit function with the value
returned by the main function as its argument
;10) reaching the } that terminates the
main function returns a value of 0. If the return type is not compatible with int, the
termination status returned to the host environment is unspecified.
Forward references: definition of terms (7.1.1), the exit function (7.20.4.3).


http://www.gnu.org/s/hello/manual/libc/ ... ermination
έγραψε:A process terminates normally when its program signals it is done by calling exit. Returning from main is equivalent to calling exit, and the value that main returns is used as the argument to exit.


http://www.utas.edu.au/infosys/info/doc ... html#abort
έγραψε:void abort();
Terminates program abnormally, by calling raise(SIGABRT).

void exit(int status);
Terminates program normally. Functions installed using atexit are called (in reverse order to that in which installed), open files are flushed, open streams are closed and control is returned to environment. status is returned to environment in implementation-dependent manner. Zero or EXIT_SUCCESS indicates successful termination and EXIT_FAILURE indicates unsuccessful termination. Implementations may define other values.
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 14 Ιουν 2011, 02:42

Α, αφού δεν είναι για σχολή, σου έγραψα κανονικά τον κώδικα τότε να τον κοιτάξεις και να πειραματιστείς :)
http://ideone.com/3GwnB

clepto έγραψε:δεν είναι για σχολή, μόλις τελείωσα την πρώτη λυκείου...
ευχαριστώ θα τα κοιτάξω όλα!
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 14 Ιουν 2011, 02:57

Ναι, αν και στο 7.20.4.3 στο 1ο από τα links σου που εξηγεί την exit() αφιερώνει αρκετές παραγράφους όπου εξηγεί αναλυτικά το cleanup που κάνει. (δοκίμασε να κάνεις και: man exit).

Κι εγώ αυτό ήξερα. Ίσως το return το 'βαλαν αργότερα να ισοδυναμεί με exit(). Καλού-κακού εγώ πάντως κάνω πάντα exit() από την main() για να είναι όσο το δυνατόν πιο συμβατός ο κώδικας (ακόμα και με K&R).

Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι

cron