ฉันถูกถามในการสัมภาษณ์ว่าเพราะเหตุใดจึงมีการมอบหมาย 777 ให้ใช้สิทธิ์ทั้งหมดสำหรับไฟล์ ทำไมไม่ 555 เขาบอกว่ามีเหตุผลสำหรับทุกสิ่ง ดังนั้นเหตุผลสำหรับ 777 คืออะไร? ทำไมไม่ใช้หมายเลขอื่น มีความสำคัญในจำนวนนี้หรือไม่?
ฉันถูกถามในการสัมภาษณ์ว่าเพราะเหตุใดจึงมีการมอบหมาย 777 ให้ใช้สิทธิ์ทั้งหมดสำหรับไฟล์ ทำไมไม่ 555 เขาบอกว่ามีเหตุผลสำหรับทุกสิ่ง ดังนั้นเหตุผลสำหรับ 777 คืออะไร? ทำไมไม่ใช้หมายเลขอื่น มีความสำคัญในจำนวนนี้หรือไม่?
คำตอบ:
ฉันจะพยายามอธิบายเหตุผลที่สำคัญว่าเพราะเหตุใดจึงเป็น 777 มากกว่า aaa หรือ 999
โปรดจำไว้ว่าการอนุญาตมีรูปแบบดังต่อไปนี้:
u g o
rwx rwx rwx
โดยที่ u = user, g = group, o = other
ทีนี้ลองจินตนาการว่าคุณเป็นตัวแทนของแต่ละกลุ่มเหล่านี้เป็นเลขฐานสอง 1 เป็นจริง 0 เป็นเท็จ
หากคุณต้องการให้ทุกคนเข้าถึงได้อย่างเต็มที่คุณจะต้องกำหนดสิทธิ์ต่อไปนี้ในรูปแบบไบนารี:
u g o
rwx rwx rwx
111 111 111
ตอนนี้ถ้าคุณรู้ว่าไบนารีคุณจะรู้ว่าเมื่อคุณแปลงจากไบนารีทศนิยมคุณจะได้รับ111
7
777
ดังนั้นคุณสามารถเป็นตัวแทนของการเข้าถึงเต็มรูปแบบเช่น
หมายเหตุ:เรากำลังแปลงจากเลขฐานสองเป็นฐานแปด ดูการแก้ไขด้านล่าง
ใช้งานได้กับโหมดการเข้าถึงอื่น ๆ ทั้งหมดเช่นกัน
ตัวอย่างเช่นเราสามารถหาค่า555
เฉลี่ยโดยแปลง5
เป็นไบนารี่ได้อย่างง่ายดายและเขียนมันในรูปแบบข้างต้น 5
ในไบนารีคือ101
ดังนั้นเราจึงมีสิทธิ์ดังต่อไปนี้:
u g o
r-x r-x r-x
101 101 101
5 5 5
ในทำนองเดียวกันถ้าเราต้องการให้สิทธิ์ทั้งหมดแก่ผู้ใช้ แต่อนุญาตให้ผู้อื่นอ่านได้เท่านั้นเราสามารถค้นหาการแทนตัวเลขได้
u g o
rwx r-- r--
111 100 100
7 4 4
ตอนนี้เรารู้ว่า111
ในเลขฐานสองเป็น7
ทศนิยมและ100
ในเลขฐานสองเป็น4
ทศนิยม 744
ดังนั้นสิทธิ์ที่จะได้รับ
ในทางเทคนิคตามที่เน้นโดย @ LưuVĩnhPhúcและ @Braiam เรากำลังแปลงจากเลขฐานสองเป็นฐานแปดดังที่อธิบายไว้ด้านล่าง อย่างไรก็ตามการแทนค่าทศนิยมและฐานแปดของตัวเลข <8 เหมือนกันดังนั้นสำหรับเลขฐานสองที่มี 3 หลักหรือน้อยกว่าการแทนทั้งทศนิยมและฐานแปดจะเท่ากัน
เมื่อแสดงเป็นตัวเลขฐานแปดแทนที่จะแบ่งออกเป็นกลุ่มละสามกลุ่มและทำการแปลงแบบไบนารีเป็นทศนิยมในแต่ละกลุ่มคุณสามารถนำทั้งสามกลุ่มมารวมกันเป็นเลขฐานสองเดียวและแปลงเป็นฐานแปด
ตัวอย่างเช่นต่อไปนี้คือการแปลงไบนารีเป็นฐานแปด:
0b111111111 == 0o777
0b101101101 == 0o555
0b111100100 == 0o744
โปรดทราบว่าฉันกำลังเติม "0b" และ "0o" เพื่อแยกความแตกต่างระหว่างเลขฐานสองและตัวเลขฐานแปด
หากคุณต้องการที่จะเล่นกับสิ่งนี้ให้เปิดเทอร์มินัลpython
จากนั้นเล่นด้วยคำสั่งต่อไปนี้:
oct(0b111111111)
bin(0o555)
อย่าลืมเติม "0b" หรือ "0o" ให้กับตัวเลขเพื่อให้คอมพิวเตอร์ทราบว่าคุณสนใจฐานแบบใด (หากคุณไม่ทำจะถือว่าเป็นฐาน 10)
7
เหมือนกันทั้งในทศนิยมและฐานแปด - แต่777
ไม่ใช่ เมื่อคุณพูดถึงการพลิกบิตมันสร้างความแตกต่าง
777
บางครั้งการอนุญาตเริ่มต้นนั้นบางครั้งเรียกว่าพระเจ้า
อ่านสิทธิ์ในแฟ้มวิธี4
เขียนสิทธิ์ในแฟ้มวิธีการและการดำเนินสิทธิ์ในแฟ้มหมายถึง2
1
7
ดังนั้นทั้งหมดนี้เป็น
ตอนนี้อะไรคือ 777: สิ่งแรก7
คือสำหรับเจ้าของไฟล์ที่หมายถึงเจ้าของไฟล์ได้อ่านถูกต้องและดำเนินการอนุญาต
อันดับที่ 2 7
สำหรับกลุ่มที่เป็นไฟล์หมายถึงกลุ่มยังมีสิทธิ์ในการอ่านเขียนและเรียกใช้งานทั้งหมด
และที่สาม7
คือการอนุญาตอื่น ๆ
หากคุณให้สิทธิ์ไฟล์ไฟล์555
นั้นowner, group and others
จะมีเพียงสิทธิ์read
และexecute
สิทธิ์not write
อนุญาตเนื่องจากสิทธิ์ในการอ่านหมายถึง 4 และดำเนินการหมายถึง 1 ดังนั้นจำนวนทั้งหมดจึงจะได้รับ5
คำไม่กี่คำตอบยอดนิยม:
แต่ละไฟล์มี 3 ตัวเลือกการอนุญาต: อ่านเขียนและดำเนินการ คุณไม่สามารถเลือกสิ่งใดสิ่งหนึ่งเหล่านี้หนึ่งในสองสิ่งเหล่านี้หรือทั้งหมดเหล่านี้:
C (3,0) + C (3,1) + C (3,2) + C (3,3) = 8
1 + 3 + 3 + 1 = 8
ดังนั้นทั้งหมดมี 8 ชุด; 8 ตัวเลือกสำหรับการอนุญาต นับจาก 0 จำนวนสุดท้ายคือ 7 (ตั้งแต่ 0 ถึง 7) ดังนั้นโดยตัวเลขนี่คือตัวเลือกทั้งหมด:
0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)
มีตัวเลขสามตัวเนื่องจากคำสั่งซื้อไปที่ [สิทธิ์ผู้ใช้] [สิทธิ์กลุ่ม] [สิทธิ์อื่น ๆ ]
ดังนั้น 777 หมายความว่าทั้งสามกลุ่มมีสิทธิ์อ่านเขียนและดำเนินการ
read
หมายเลข 4 แทนหมายเลข 3
0 - nothing
1 - execute
2 - write
3 - read
4 - execute + read (1 + 3)
5 - write + read (2 + 3)
6 - execute + write + read (3 + 2 + 1)
7 - ????? no way to get this with the 3 basic options (and we are missing execute + write)
วิธีเดียวที่จะได้รับชุดค่าผสมที่ไม่ซ้ำกันสำหรับความเป็นไปได้ทั้งหมดคือไปด้วยพลังของ 2 สำหรับตัวเลือกพื้นฐาน 2 0 = 1 (ดำเนินการ), 2 1 = 2 (เขียน), 2 2 = 4 (อ่าน) และถ้ามีตัวเลือกพื้นฐานที่ 4 ก็จะมีหมายเลข 2 3 = 8 โปรดทราบว่าwrite
จะไม่แสดงจนกว่าจะรวมกันทั้งหมดของ ตัวเลือกก่อนหน้านี้มีอยู่ในรายการ (ซึ่งเป็นเพียงตัวเลือกเดียวเนื่องจากเป็นเพียงexecute
) read
จะไม่ปรากฏจนกว่าจะมีการรวมกันของตัวเลือกก่อนหน้าทั้งหมด (อีกครั้งหนึ่งเนื่องจากมีเพียงชุดค่าผสมเดียวที่มีสองตัวเลือก - execute
+ write
) execute
+ write
+read
ไม่แสดงจนกว่าชุดค่าผสมก่อนหน้านี้ทั้งหมดจะถูกแสดงรายการซึ่งก็คือ 3 เนื่องจากขณะนี้มีสองตัวเลือกจากสามสิทธิ์ รายการจะดำเนินต่อไปในลักษณะนี้ไม่ว่าจะมีตัวเลือกพื้นฐานจำนวนเท่าใด เพื่อประโยชน์ในการเป็นตัวอย่างมี 4 ตัวเลือกพื้นฐาน (โปรดทราบว่าเรารู้ด้วยเช่นกันว่าจะมีชุดค่าผสมทั้งหมด 16 ชุดเนื่องจากมี 4 ตัวเลือกและ 2 4 = 16):
0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)
8 - love
9 - execute + love (1 + 8)
10 - write + love (2 + 8)
11 - execute + write + love (1 + 2 + 8)
12 - read + love (4 + 8)
13 - execute + read + love (1 + 4 + 8)
14 - write + read + love (2 + 4 + 8)
15 - execute + write + read + love (1 + 2 + 4 + 8)
ฉันประหลาดใจที่มีคำตอบคล้าย ๆ กันมากมายที่พลาดไม่ได้เลย
หลังจากพิจารณา 3 คลาสที่จำเป็นต้องอ่านให้เขียนและดำเนินการ พวกเขาไปกับฐานแปด (3 ชิ้น) เพื่อลดพื้นที่ที่จำเป็นสำหรับการจัดการระบบไฟล์
ด้วยเหตุผลบางอย่างผู้ออกแบบ UNIX ตัดสินใจใช้หมายเลข OCTALสำหรับการอนุญาตไฟล์ อย่างที่คุณทราบค่าสูงสุดสำหรับเลขฐานแปดหนึ่งหลักคือ 7 ปรากฎว่าเลขฐานแปดหนึ่งสำหรับการเข้าถึงของผู้ใช้หนึ่งสำหรับการเข้าถึงกลุ่มและหนึ่งสำหรับการเข้าถึงโลกเพียงพอสำหรับเกือบทุกอย่าง จำนวนฐานแปด 3digit สูงสุดคือ 777 และเหมาะสมที่จะแสดงว่า "การเข้าถึงทุกคน / ทุกอย่าง"
ทุกวันนี้เราทุกคนรู้ว่าไบต์เป็น 8 บิต : สิ่งนี้ได้รับการยอมรับในระดับสากลมานานหลายทศวรรษ แต่นั่นไม่ใช่กรณีเสมอไปและUnix (ซึ่งเป็นแรงบันดาลใจให้ Linux ในหลาย ๆ ด้าน) เขียนขึ้นในช่วงเวลาที่ยังมีการถกเถียงกันอยู่ โดยเฉพาะอย่างยิ่งจำเป็นต้องพกพาไปยังระบบที่ใช้ 6-bit bytes หรือ 8-bit bytes บางคนที่เขียนมันอยู่ในด้านหนึ่งของการอภิปรายและคนอื่น ๆ ที่อยู่อีกด้านหนึ่ง
ในบันทึกที่เกี่ยวข้อง Base-2 (ไบนารี) ไม่ใช่เครื่องหมายที่สะดวกมากสำหรับการเขียนค่า ทุกวันนี้โปรแกรมเมอร์ส่วนใหญ่เขียนเครื่องหมายขนาดเล็กที่ใช้ Base-16 (เลขฐานสิบหก)แทน 16 มีขนาดใหญ่พอสำหรับฐานที่คุณสามารถแพ็คสี่บิตให้เป็นเลขฐานสิบหก: ตัวอย่างเช่น "0000" ในไบนารีคือ 0x0 ในเลขฐานสิบหก (นั่นคือ "0x" เป็นวิธีการทั่วไปที่จะทราบว่าคุณกำลังจะ เขียนตัวเลขฐานสิบหก) ในขณะที่ "1111" คือ 0xF (หรือ 15 เป็นทศนิยม) คุณสามารถเขียนการรวมกันที่เป็นไปได้ของสี่บิตโดยใช้เลขฐานสิบหกหลักเดียวเพียงแค่นับเป็นเลขฐานสองและเนื่องจากวิธีการคำนวณทางคณิตศาสตร์แบบตำแหน่งคุณสามารถวางซ้อนกันได้: เลขฐานสิบหกสองเลขสามารถเข้ารหัสชุดที่เป็นไปได้ใด ๆ โดยการนับและอื่น ๆ ดังนั้นคน 8 บิตจึงชอบสิ่งนี้
ผู้ใช้ 6 บิตมีวิธีการทำเช่นนี้ของตัวเอง แต่แทนที่จะใช้ Base-16 พวกเขาใช้ Base-8 (octal) มันมีข้อดีคล้ายกับเลขฐานสิบหก: คุณสามารถเก็บตำแหน่งใด ๆ ของสามบิตในฐานแปดหลักและคุณสามารถสแต็กหลักขึ้นในลักษณะที่คล้ายกัน ดังนั้นเช่นเดียวกับ 8-bit folks ที่ใช้เลขฐานสิบหกสองหลักสำหรับหนึ่งไบต์ 6-bit folks ใช้สอง octal-ดิจิตสำหรับไบต์ คุณไม่เห็นเลขฐานแปดอีกต่อไป แต่โดยทั่วไปแล้วมันจะถูกบันทึกด้วยศูนย์นำหน้าตัวอย่างเช่น "111" คือ 07 ในฐานแปด
ทีนี้สิ่งทั้งหมดนี้เกี่ยวข้องกับการอนุญาตยูนิกซ์? เท่าที่ Unix กังวลมีสามสิ่งที่คุณสามารถทำได้กับไฟล์: คุณสามารถอ่านได้คุณสามารถเขียนมันหรือคุณสามารถรันมันเป็นโปรแกรม หากคุณกำลังจะ จำกัด ด้วยสิทธิ์คุณต้องมีบิตสำหรับแต่ละรายการ: เปิดใช้สำหรับสิ่งที่บางคนได้รับอนุญาตให้ทำแล้วปล่อยทิ้งไว้สำหรับสิ่งที่บางคนไม่ได้รับอนุญาตให้ทำ เนื่องจากมีสามสิ่งที่ถูกติดตามคุณต้องมีสามบิตและเนื่องจาก Unix ติดตามไปตามสามบรรทัด (เจ้าของกลุ่มและทุกคน) คุณจึงต้องมีเก้าบิตทั้งหมด
ในบางจุดตามแนวคน -probably ใน camp- 6 บิตกล่าวว่า "เฮ้เราสามารถใช้ฐานแปดหลักสำหรับเรื่องนี้" และนี่กลายเป็นสัญกรณ์ที่สะดวกสบายมาก: เลขฐานแปดสามหลักก็เพียงพอที่จะเข้ารหัสได้ทุกการรวมกันของฟิลด์บิต เมื่อพวกเขาตัดสินใจที่จะทำสิ่งนี้ชะตากรรมของ 777 (และของยุค 000) ถูกผนึกเพราะตัวเลขเหล่านั้นจะเหมือนกันไม่ว่าพวกเขาจะจัดเรียงบิตอย่างไร แต่ลำดับสำคัญสำหรับตัวเลขอื่น ๆ ทั้งหมดดังนั้นพวกเขาจึงเริ่มทำเช่นนี้
พวกเขาจัดการสิทธิ์ในฟิลด์สามบิต: อ่านตอนเริ่มต้นเขียนตรงกลางและดำเนินการเมื่อสิ้นสุด จากนั้นพวกเขาจัดเรียงฟิลด์เอง: เจ้าของตอนเริ่มกลุ่มตรงกลางและคนอื่น ๆ ในตอนท้าย เมื่อพวกเขาทำสิ่งนี้พวกเขาต้องทำเพื่อกำหนดจำนวนที่เหลือให้นับ
เนื่องจากเป็นเขตข้อมูล 3 บิตคุณสามารถพูดได้ว่าแต่ละหมายเลขแปดหลักควบคุมหนึ่งในฟิลด์ : หลักแรกควบคุมสิทธิ์ของเจ้าของ, หลักที่สองควบคุมสิทธิ์ของกลุ่มและหลักที่สามควบคุมสิทธิ์อื่น ๆ ดังนั้น 777 (111 111 111) จึงเป็นสิทธิ์ทั้งหมดสำหรับทุกคนในขณะที่ 700 (111 000 000) เป็นสิทธิ์ทั้งหมดสำหรับเจ้าของเท่านั้น ชุดค่าผสมอื่น ๆ ก็มีเหมือนกัน: 666 (110 110 110) ถูกอ่าน / เขียนสำหรับทุกคน แต่ไม่ได้ดำเนินการ) ในขณะที่ 555 (101 101 101) สามารถอ่าน / ดำเนินการสำหรับทุกคน แต่ไม่ได้เขียนและ 400 (100 000 000) สำหรับเจ้าของเท่านั้นและไม่สามารถเข้าถึงได้สำหรับผู้อื่น
และนั่นคือเหตุผลที่ 777 หมายถึงการอนุญาตทั้งหมด ทุกวันนี้อาจเป็นเหตุผลที่คนส่วนใหญ่นิยมใช้ octal เลยแม้ว่า Unix และลูกหลานของมันจะยังมีร่องรอยอื่น ๆ อยู่บ้าง ตัวอย่างเช่น, od
หรือ Octal Dump เป็นวิธีการรับไบนารีดัมพ์ของไฟล์ในรูปแบบฐานแปด (มันมีลูกพี่ลูกน้องฐานสิบหกที่เรียกว่าxxd
, แต่นั่นก็ไม่เป็นที่รู้จักกันดี นอกจากนี้ยังเป็นสาเหตุที่คุณต้องระมัดระวังเลขศูนย์นำหน้าในภาษาการเขียนโปรแกรมบางอย่างเพราะพวกเขาอาจคิดว่าคุณตั้งใจที่จะเขียนตัวเลขเป็นเลขฐานแปดเมื่อไม่ใช่เจตนาของคุณ