17Aug
Όταν χρησιμοποιείτε το Linux και το OS X, το λειτουργικό σύστημα δεν θα σας εμποδίσει να διαγράψετε ένα αρχείο που χρησιμοποιείται αυτή τη στιγμή στα Windows, θα σας εμποδιστεί ρητά να το κάνετε.Τι δίνει;Γιατί μπορείτε να επεξεργαστείτε και να διαγράψετε αρχεία σε χρήση σε συστήματα που προέρχονται από Unix, αλλά όχι σε Windows;
Η σημερινή ερώτηση &Η συνάντηση απαντήσεων έρχεται με την ευγένεια του SuperUser - μια υποδιαίρεση του Stack Exchange, μια κοινότητα-καθοδηγούμενη ομαδοποίηση Q & A ιστοσελίδες.
Η ερώτηση
SuperUser reader the.midget θέλει να μάθει γιατί τα Linux και τα Windows αντιμετωπίζουν τα αρχεία χρήσης κατά διαφορετικό τρόπο:
Ένα από τα πράγματα που με προβλημάτισε από τότε που άρχισα να χρησιμοποιώ το Linux είναι το γεγονός ότι σας επιτρέπει να αλλάξετε το όνομαένα αρχείο ή ακόμη και να το διαγράψετε ενώ διαβάζεται.Ένα παράδειγμα είναι το πώς κατά λάθος προσπάθησα να διαγράψω ένα βίντεο ενώ έπαιζε.Το κατάφερα και ήταν έκπληκτος καθώς έμαθα ότι μπορείτε να αλλάξετε σχεδόν τίποτα σε ένα αρχείο χωρίς να φροντίζετε αν χρησιμοποιείται αυτή τη στιγμή ή όχι.
Έτσι τι συμβαίνει πίσω από τις σκηνές και τον εμποδίζετε να διαγράψει χωρίς δισταγμό τα πράγματα στα Windows όπως μπορεί στο Linux;
Οι συνεισφέροντες απάντησης
SuperUser ρίχνουν λίγο φως στην κατάσταση για το αντικείμενο.Amazed γράφει:
Κάθε φορά που ανοίγετε ή εκτελείτε ένα αρχείο στα Windows, τα Windows κλειδώνουν το αρχείο στη θέση του( πρόκειται για απλούστευση, αλλά συνήθως ισχύει.) Ένα αρχείο που κλειδώνεται από μια διαδικασία δεν μπορεί να διαγραφεί μέχρι να κυκλοφορήσει αυτή η διαδικασία.Αυτός είναι ο λόγος για τον οποίο κάθε φορά που τα Windows πρέπει να ενημερωθούν, χρειάζεστε μια επανεκκίνηση για να τεθεί σε ισχύ.
Από την άλλη πλευρά, τα λειτουργικά συστήματα που μοιάζουν με Unix, όπως το Linux και το Mac OS X, δεν κλειδώνουν το αρχείο αλλά τους υποκείμενους τομείς δίσκου.Αυτό μπορεί να φαίνεται μια ασήμαντη διαφοροποίηση αλλά σημαίνει ότι η εγγραφή του αρχείου στον πίνακα περιεχομένων του συστήματος αρχείων μπορεί να διαγραφεί χωρίς να διαταραχθεί οποιοδήποτε πρόγραμμα που έχει ήδη ανοίξει το αρχείο.Έτσι, μπορείτε να διαγράψετε ένα αρχείο ενώ εξακολουθεί να εκτελείται ή να χρησιμοποιείται με άλλο τρόπο και θα συνεχίσει να υπάρχει στο δίσκο, εφόσον κάποια διαδικασία έχει ανοιχτή λαβή για αυτό, παρόλο που η καταχώρησή του στον πίνακα αρχείων έχει φύγει.
Ο David Schwartz επεκτείνει την ιδέα και τονίζει πώς πρέπει να είναι τα πράγματα ιδανικά και πώς είναι στην πράξη:
Τα Windows προεπιλεγούν σε αυτόματο, υποχρεωτικό κλείδωμα αρχείων.Το UNIX είναι προεπιλεγμένο σε χειροκίνητο, συνεργατικό κλείδωμα αρχείων.Και στις δύο περιπτώσεις, οι προεπιλογές μπορούν να αντικατασταθούν, αλλά και στις δύο περιπτώσεις συνήθως δεν είναι.
Πολλά παλιά κώδικα των Windows χρησιμοποιούν το C / C ++ API( λειτουργίες όπως fopen) και όχι το εγγενές API( λειτουργίες όπως CreateFile).Το C / C ++ API δεν σας δίνει τρόπο να καθορίσετε τον τρόπο με τον οποίο θα λειτουργήσει το υποχρεωτικό κλείδωμα, έτσι ώστε να λάβετε τις προεπιλογές.Η προεπιλεγμένη "λειτουργία κοινής χρήσης" τείνει να απαγορεύει τις "αντικρουόμενες" λειτουργίες.Εάν ανοίξετε ένα αρχείο για εγγραφή, οι εγγραφές θεωρείται ότι έρχονται σε σύγκρουση, ακόμα και αν ποτέ δεν γράφετε πραγματικά στο αρχείο.Ditto για μετονομασία.
Και, εδώ, γίνεται χειρότερη.Εκτός από το άνοιγμα για ανάγνωση ή εγγραφή, το C / C ++ API δεν παρέχει τρόπο να καθορίσετε τι σκοπεύετε να κάνετε με το αρχείο.Επομένως, το API πρέπει να υποθέσει ότι πρόκειται να εκτελέσετε οποιαδήποτε νομική πράξη.Δεδομένου ότι το κλείδωμα είναι υποχρεωτικό, θα αφεθεί ανοικτό το οποίο επιτρέπει μια αντιφατική λειτουργία, ακόμη και αν ο κώδικας δεν είχε ποτέ σκοπό να εκτελέσει τη συγκρουόμενη λειτουργία, αλλά άνοιξε ακριβώς το αρχείο για άλλο σκοπό.
Έτσι, εάν ο κώδικας χρησιμοποιεί το API C / C ++ ή χρησιμοποιεί το εγγενές API χωρίς να σκεφτεί ειδικά αυτά τα ζητήματα, θα τελειώσει, εμποδίζοντας το μέγιστο σύνολο πιθανών λειτουργιών για κάθε αρχείο που ανοίγει και δεν μπορεί να ανοίξει ένα αρχείο,θα μπορούσαν να εκτελέσουν σε αυτό αφότου άνοιξε δεν έχει καμία επίθεση.
Κατά τη γνώμη μου, η μέθοδος των Windows θα λειτουργούσε πολύ καλύτερα από τη μέθοδο UNIX αν κάθε πρόγραμμα επέλεξε τις λειτουργίες κοινόχρηστων εφαρμογών και τις ανοιχτές λειτουργίες με σοφά και σωστά διαχειριζόμενες περιπτώσεις αποτυχίας.Η μέθοδος UNIX, ωστόσο, λειτουργεί καλύτερα αν ο κώδικας δεν έχει τον κόπο να σκεφτεί αυτά τα θέματα.Δυστυχώς, το βασικό API C / C ++ δεν χαρτογραφεί καλά στο API αρχείου των Windows με τρόπο που να χειρίζεται τις λειτουργίες κοινόχρηστων εφαρμογών και οι αντιφατικές λύσεις ανοίγουν καλά.Έτσι το καθαρό αποτέλεσμα είναι λίγο βρώμικο.
Υπάρχει αυτό: δύο διαφορετικές προσεγγίσεις στο χειρισμό αρχείων αποφέρουν δύο διαφορετικά αποτελέσματα.
Έχετε κάτι να προσθέσετε στην εξήγηση;Απενεργοποιήστε τα σχόλια.Θέλετε να διαβάσετε περισσότερες απαντήσεις από άλλους χρήστες τεχνολογίας Stack Exchange;Δείτε το πλήρες νήμα συζήτησης εδώ.