คำว่า“ ขอเกี่ยว” ในการเขียนโปรแกรมหมายถึงอะไร


248

ฉันเพิ่งได้ยินคำว่า "เบ็ด" ในขณะที่พูดคุยกับบางคนเกี่ยวกับโปรแกรมที่ฉันเขียน ฉันไม่แน่ใจว่าคำนี้มีความหมายอย่างไรแม้ว่าฉันจะอนุมานจากการสนทนาว่าเบ็ดเป็นฟังก์ชันประเภทหนึ่ง ฉันค้นหาคำจำกัดความ แต่ไม่สามารถหาคำตอบที่ดี ใครบางคนจะสามารถให้ฉันคิดว่าคำนี้หมายถึงอะไรโดยทั่วไปและอาจเป็นตัวอย่างเล็ก ๆ เพื่อแสดงความหมาย?


3
ดูHooking @ วิกิพีเดีย ลิงก์ถูกฝังอยู่ในหนึ่งในคำตอบที่ได้คะแนนต่ำกว่า
Palec

คำตอบ:


143

โดยพื้นฐานแล้วมันเป็นรหัสที่ให้คุณเข้าไปในโมดูลเพื่อแสดงพฤติกรรมที่แตกต่างหรือตอบสนองเมื่อมีอะไรเกิดขึ้น


7
สิ่งนี้คล้ายกับการติดต่อกลับหรือไม่
คริส

19
hooks บ่อยครั้ง (แต่ไม่เสมอไป) ใช้ฟังก์ชั่นการโทรกลับ ตัวอย่างเช่นคุณอาจขอระบบเหตุการณ์โดยใช้ "hookEvent (Events.STARTUP, myCallbackFunction)" คุณกำลังส่งตัวชี้ฟังก์ชันไปยังฟังก์ชัน hookEvent ดังนั้นจึงรู้ว่าจะเรียกฟังก์ชันใดเมื่อเกิดเหตุการณ์ หวังว่าจะช่วย :-)
วิลเลียม Brendel

6
อย่างแน่นอน การเรียกกลับเป็น "ประเภท" เบ็ด
คาห์

21
อืมไม่. การโทรกลับเป็นการโทรกลับและไม่เกี่ยวข้องกับ hooks การโทรกลับจะถูกใช้เพื่อการใช้วิธีการขอ การเรียกกลับเป็นพอยน์เตอร์ (RELJMP) สำหรับฟังก์ชั่น / วิธีการ / ขั้นตอน (CALL), hooks เป็นการแก้ไขแอปพลิเคชั่นที่กำลังรันอยู่
specializt

1
@SahilBabbar ไม่การขัดจังหวะทำให้คำแนะนำในบางสถานที่ที่ระบุ (ขัดจังหวะ) ที่จะดำเนินการ คุณอาจสามารถขอเข้าสู่กระบวนการจัดการขัดจังหวะได้เช่นโดยการปรับเปลี่ยนตารางที่แสดงตำแหน่งของตัวจัดการขัดจังหวะเพื่อให้รหัสของคุณถูกเรียกเป็นอันดับแรกในการขัดจังหวะ (จากนั้นรหัสของคุณจะเรียกรหัสการจัดการขัดจังหวะก่อนหน้านี้ ลักษณะเดซี่เชน)
David Tonhofer

77

hook คือฟังก์ชันการทำงานที่ให้บริการโดยซอฟต์แวร์สำหรับผู้ใช้ซอฟต์แวร์นั้นเพื่อให้มีรหัสของตัวเองที่เรียกว่าภายใต้สถานการณ์บางอย่าง รหัสนั้นสามารถเพิ่มหรือแทนที่รหัสปัจจุบันได้

ในสมัยก่อนเมื่อคอมพิวเตอร์เป็นส่วนตัวอย่างแท้จริงและไวรัสนั้นแพร่หลายน้อยกว่า (ฉันกำลังพูดถึงยุค 80) มันเป็นเรื่องง่ายเหมือนการติดตั้งซอฟต์แวร์ระบบปฏิบัติการเพื่อเรียกรหัสของคุณ ฉันจำได้ว่าเขียนส่วนขยายไปยังภาษา Applesoft BASIC ใน Apple II ซึ่งเพียงแค่ติดรหัสของฉันไว้ในล่ามพื้นฐานโดยการฉีดการโทรไปยังรหัสของฉันก่อนที่จะประมวลผลบรรทัดใด ๆ

คอมพิวเตอร์บางเครื่องมี hooks ที่ออกแบบไว้ล่วงหน้าตัวอย่างหนึ่งคือ I / O สตรีมบน Apple II มันใช้เบ็ดนี้เพื่อฉีดระบบย่อยของดิสก์ทั้งหมด (แต่เดิม Apple II ROM ถูกสร้างขึ้นในสมัยที่เทปเป็นสื่อกลางในการเก็บข้อมูลหลักสำหรับพีซี) คุณควบคุมดิสก์โดยการพิมพ์รหัส ASCII 4 ( CTRL-D) แล้วตามด้วยคำสั่งที่คุณต้องการเรียกใช้จากนั้น a CRและถูกดักจับโดยระบบย่อยของดิสก์ซึ่งติดอยู่ในรูทีนการพิมพ์ Apple ROM

ตัวอย่างเช่นบรรทัด:

PRINT CHR(4);"CATALOG"
PRINT CHR(4);"IN#6"

จะแสดงรายการเนื้อหาของดิสก์จากนั้นเริ่มต้นเครื่องใหม่ สิ่งนี้อนุญาตให้ใช้เทคนิคต่าง ๆ เช่นการปกป้องโปรแกรมพื้นฐานของคุณโดยตั้งค่าบรรทัดแรกเป็น

123 REM XIN#6

จากนั้นใช้POKEเพื่อแทรกCTRL-Dอักขระในตำแหน่งที่Xเคยเป็น จากนั้นทุกคนที่พยายามแสดงรายการที่มาของคุณจะส่งลำดับการเริ่มต้นใหม่ผ่านรูทีนเอาต์พุตที่ระบบย่อยของดิสก์จะตรวจพบ

นั่นมักเป็นกลอุบายที่เราต้องใช้เพื่อให้ได้พฤติกรรมที่เราต้องการ

ทุกวันนี้ด้วยระบบปฏิบัติการที่มีความปลอดภัยมากขึ้นก็มีสิ่งอำนวยความสะดวกสำหรับ hooks เองเนื่องจากคุณไม่ควรแก้ไขระบบปฏิบัติการ "บนเครื่องบิน" หรือบนดิสก์อีกต่อไป

พวกเขาอยู่แถวนี้มานานแล้ว เมนเฟรมมีพวกเขา (เรียกว่าออก) และซอฟต์แวร์เมนเฟรมจำนวนมากใช้สิ่งอำนวยความสะดวกเหล่านั้นแม้ตอนนี้ ตัวอย่างเช่นระบบควบคุมซอร์สโค้ดฟรีที่มาพร้อมกับ z / OS (เรียกว่า SCLM) ช่วยให้คุณสามารถแทนที่ระบบย่อยการรักษาความปลอดภัยโดยเพียงแค่วางรหัสของคุณเองในทางออก


41

โดยทั่วไปแล้วคำว่า "hook" คือสิ่งที่จะทำให้คุณเป็นโปรแกรมเมอร์มุมมองและ / หรือโต้ตอบกับและ / หรือเปลี่ยนแปลงบางสิ่งที่เกิดขึ้นในระบบ / โปรแกรม

ตัวอย่างเช่น Drupal CMS มอบตะขอให้นักพัฒนาที่ให้พวกเขาดำเนินการเพิ่มเติมหลังจากที่ "โหนดเนื้อหา" ถูกสร้างขึ้น หากนักพัฒนาไม่ได้ใช้เบ็ดจะถูกสร้างขึ้นตามปกติ หากนักพัฒนาใช้ hook พวกเขาสามารถให้โค้ดเพิ่มเติมทำงานเมื่อมีการสร้างโหนด รหัสนี้สามารถทำอะไรก็ได้รวมถึงการย้อนกลับและ / หรือแก้ไขการกระทำเดิม มันสามารถทำสิ่งที่ไม่เกี่ยวข้องกับการสร้างโหนดได้อย่างสมบูรณ์

การโทรกลับอาจคิดว่าเป็นตะขอชนิดหนึ่ง โดยการใช้ฟังก์ชั่นการโทรกลับเข้าสู่ระบบระบบนั้นจะช่วยให้คุณสามารถเรียกรหัสเพิ่มเติมบางอย่างหลังจากการกระทำเสร็จสมบูรณ์ อย่างไรก็ตามการเชื่อมต่อ (เป็นคำทั่วไป) ไม่ได้ จำกัด อยู่ที่การโทรกลับ

ตัวอย่างอื่น. บางครั้งนักพัฒนาเว็บจะอ้างถึงชื่อคลาสและ / หรือ ID ในองค์ประกอบเป็น hooks นั่นเป็นเพราะโดยการวาง ID / คลาสชื่อบนองค์ประกอบจากนั้นพวกเขาสามารถใช้ Javascript เพื่อแก้ไของค์ประกอบนั้นหรือ "เบ็ดใน" ในเอกสารหน้า (นี่คือการยืดความหมาย แต่มันถูกใช้กันทั่วไปและมีมูลค่าการกล่าวขวัญ)


คุณหมายถึงอะไร "ตะขอเข้าสู่หน้าเอกสาร"? คุณยกตัวอย่างได้ไหม ฉันเข้าใจตัวอย่างแรก - ให้องค์ประกอบ html เป็นรหัสเพื่อให้คุณสามารถใช้ javacript เพื่อแก้ไของค์ประกอบ
committedandroider

21

ง่ายพูดว่า:

เบ็ดเป็นวิธีการดำเนินการรหัสที่กำหนดเอง (ฟังก์ชั่น) ทั้งก่อนหลังหรือแทนรหัสที่มีอยู่ ตัวอย่างเช่นฟังก์ชั่นอาจถูกเขียนลงใน "hook" ลงในกระบวนการเข้าสู่ระบบเพื่อดำเนินการฟังก์ชั่น Captcha ก่อนที่จะดำเนินการต่อในกระบวนการเข้าสู่ระบบปกติ


คำตอบที่ดีที่สุด
Daniel


15

Hooks เป็นหมวดหมู่ของฟังก์ชั่นที่อนุญาตให้ใช้รหัสพื้นฐานในการเรียกรหัสส่วนขยาย สิ่งนี้มีประโยชน์ในสถานการณ์ที่ผู้พัฒนาหลักต้องการเสนอความสามารถในการขยายโดยไม่ต้องเปิดเผยรหัส

การใช้ hooks หนึ่งครั้งเป็นการพัฒนา mod ของวิดีโอเกม เกมอาจไม่อนุญาตให้ผู้พัฒนา mod เพิ่มฟังก์ชันการทำงานพื้นฐาน แต่สามารถเพิ่ม hooks ได้โดยผู้พัฒนา core mod Library ด้วยตะขอเหล่านี้นักพัฒนาซอฟต์แวร์อิสระสามารถมีรหัสที่กำหนดเองของพวกเขาเรียกตามเหตุการณ์ที่ต้องการเช่นการโหลดเกมการอัพเดทสินค้าคงคลังการโต้ตอบเอนทิตี ฯลฯ

วิธีการทั่วไปของการใช้งานคือการให้ฟังก์ชั่นรายการที่ว่างของการเรียกกลับแล้วเปิดเผยความสามารถในการขยายรายการของการเรียกกลับ รหัสฐานจะเรียกใช้ฟังก์ชันในเวลาเดียวกันและเหมาะสม แต่ด้วยรายการโทรกลับที่ว่างเปล่าฟังก์ชันจะไม่ทำอะไรเลย นี่คือโดยการออกแบบ

จากนั้นบุคคลที่สามมีโอกาสที่จะเขียนรหัสเพิ่มเติมและเพิ่มการเรียกกลับใหม่ของพวกเขาไปยังรายการโทรกลับของเบ็ด ไม่มีอะไรมากไปกว่าการอ้างอิงของ hooks ที่ใช้งานได้พวกเขาจึงเพิ่มฟังก์ชันการทำงานโดยมีความเสี่ยงน้อยที่สุดต่อระบบฐาน

Hooks ไม่อนุญาตให้นักพัฒนาทำอะไรที่ไม่สามารถทำได้กับโครงสร้างและส่วนต่อประสานอื่น ๆ พวกเขาเป็นทางเลือกที่จะทำโดยคำนึงถึงงานและผู้ใช้ (นักพัฒนาบุคคลที่สาม)

สำหรับการชี้แจง: เบ็ดช่วยให้ส่วนขยายและอาจนำมาใช้โดยใช้การเรียกกลับ โดยทั่วไปการเรียกกลับไม่มีอะไรมากไปกว่าตัวชี้ฟังก์ชัน ที่อยู่ที่คำนวณของฟังก์ชัน ดูเหมือนจะมีความสับสนในคำตอบ / ความคิดเห็นอื่น ๆ


4

Hook หมายถึงสถานที่ในรหัสที่คุณส่งเหตุการณ์บางประเภทและหากเหตุการณ์นี้ได้รับการลงทะเบียนก่อนด้วยฟังก์ชั่นที่เหมาะสมในการโทรกลับก็จะถูกจัดการโดยฟังก์ชั่นที่ลงทะเบียนนี้มิฉะนั้นจะไม่มีอะไรเกิดขึ้น


2

สามารถเรียกใช้ hooks เมื่อเงื่อนไขบางอย่างเกิดขึ้น เช่นการเปลี่ยนแปลงตัวแปรบางอย่างหรือการกระทำบางอย่างเรียกว่าหรือบางเหตุการณ์เกิดขึ้น hooks สามารถเข้าสู่กระบวนการและเปลี่ยนแปลงสิ่งต่าง ๆ หรือตอบสนองต่อการเปลี่ยนแปลง


1

บ่อยครั้งที่การอ้างถึง hooking หมายถึงข้อความของ hooking Win32หรือเทียบเท่า Linux / OSX แต่เพิ่มเติม hooking โดยทั่วไปคือเพียงแจ้งวัตถุ / หน้าต่าง / โปรแกรม / etc อื่นที่คุณต้องการได้รับแจ้งเมื่อการกระทำที่ระบุเกิดขึ้น ตัวอย่างเช่น: การมีหน้าต่างทั้งหมดในระบบแจ้งให้คุณทราบขณะที่กำลังจะปิด

ตามกฎทั่วไปการผูกเบ็ดค่อนข้างอันตรายเนื่องจากทำโดยไม่เข้าใจว่ามันส่งผลกระทบต่อระบบอย่างไรอาจนำไปสู่ความไม่แน่นอนหรือพฤติกรรมที่ไม่คาดคิด นอกจากนี้ยังสามารถเป็นประโยชน์อย่างมากในบางสถานการณ์ความคิด ตัวอย่างเช่น: FRAPSใช้เพื่อกำหนดหน้าต่างที่ควรแสดงว่าเป็นตัวนับ FPS


1

chain of hooks เป็นชุดของฟังก์ชั่นที่แต่ละฟังก์ชั่นจะเรียกใช้ถัดไป สิ่งที่มีความสำคัญเกี่ยวกับ chain of hooks คือโปรแกรมเมอร์สามารถเพิ่มฟังก์ชั่นอื่น ๆ ใน chain ในเวลาทำงาน วิธีหนึ่งในการทำเช่นนี้คือการค้นหาตำแหน่งที่ทราบซึ่งที่อยู่ของฟังก์ชันแรกในห่วงโซ่จะถูกเก็บไว้ จากนั้นคุณบันทึกค่าของตัวชี้ฟังก์ชันนั้นและเขียนทับค่าที่ที่อยู่เริ่มต้นด้วยที่อยู่ของฟังก์ชันที่คุณต้องการแทรกลงในห่วงโซ่เบ็ด ฟังก์ชั่นนั้นจะถูกเรียกใช้ทำธุรกิจและเรียกใช้ฟังก์ชันถัดไปในห่วงโซ่ (เว้นแต่คุณจะตัดสินใจเป็นอย่างอื่น) โดยปกติแล้วมีวิธีอื่น ๆ อีกมากมายในการสร้างห่วงโซ่ของตะขอจากการเขียนโดยตรงไปยังหน่วยความจำจนถึงการใช้สิ่งอำนวยความสะดวก metaprogramming ของภาษาเช่น Ruby หรือ Python

ตัวอย่างของ chain hooks เป็นวิธีที่แอปพลิเคชั่น MS Windows ประมวลผลข้อความ แต่ละฟังก์ชันในเชนการประมวลผลประมวลผลข้อความหรือส่งไปยังฟังก์ชันถัดไปในเชน


1

ในระบบการจัดการเนื้อหาของ Drupal 'hook' มีความหมายที่ค่อนข้างเฉพาะ เมื่อมีเหตุการณ์ภายในเกิดขึ้น (เช่นการสร้างเนื้อหาหรือการเข้าสู่ระบบของผู้ใช้เป็นต้น) โมดูลสามารถตอบสนองต่อเหตุการณ์โดยใช้ฟังก์ชัน "hook" พิเศษ สิ่งนี้ทำได้ผ่านการตั้งชื่อแบบแผน - [your-plugin-name] _user_login () สำหรับเหตุการณ์การเข้าสู่ระบบของผู้ใช้ตัวอย่างเช่น

เนื่องจากระเบียบนี้เหตุการณ์อ้างอิงจึงเรียกว่า "hooks" และปรากฏขึ้นพร้อมชื่อเช่น "hook_user_login" และ "hook_user_authenticate ()" ในเอกสาร API ของ Drupal


สิ่งนี้เป็นไปตามแนวคิดดังกล่าวข้างต้นของ "การติดต่อกลับ" "เพื่อตอบสนองเมื่อมีบางสิ่งเกิดขึ้น" ในกรณีนี้การโทรกลับไม่ได้ลงทะเบียนอย่างชัดเจน แต่ขึ้นอยู่กับ "การตั้งชื่อมายากล" ขณะนี้มีการพูดคุยกันใน drupal.org โปรดดูที่ใช้ Symfony EventDispatcher สำหรับ hooks กิจกรรม
donquixote

ในการพูดคุยตะขอ / โทรกลับ / ฟังสามารถ "ทำให้รู้จักรหัสการโทร" ในรูปแบบที่แตกต่างกัน (ไม่ได้บอกว่านี้เสร็จสมบูรณ์): 1. ฟังก์ชั่นชื่อมายากล 2. ชั้นเรียนมายากลชื่อ 3. ฟังก์ชั่นที่ลงทะเบียนอย่างชัดเจน วัตถุที่ลงทะเบียน (ผู้ฟังสมาชิกผู้สังเกตการณ์) 5. ชื่อคลาสที่ลงทะเบียนไว้อย่างชัดเจน (+ คอนสตรัคเตอร์ตัวเลือกเพิ่มเติม) เพื่อสร้างอินสแตนซ์ก่อนที่ตะขอจะเริ่ม 6. โดยการแก้ไขรหัสโทร
donquixote

1

ในสั้นมากคุณสามารถเปลี่ยนรหัสของการโทร API เช่นMessageBoxที่มันทำหน้าที่แตกต่างกันแก้ไขโดยคุณ (ทั่วโลกจะทำงานทั้งระบบกว้างภายในเครื่องจะทำงานกระบวนการกว้าง)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.