สัญญาณ POSIX ใน C

Sayyan Posix Ni C



“แม้ว่าภาษาการเขียนโปรแกรมทุกภาษาจะมีไลบรารีจำนวนมากสำหรับวัตถุประสงค์เฉพาะ แต่ไลบรารี POSIX ของ C ก็มีที่ของมัน ได้รับการออกแบบมาเพื่อสร้างความกลมกลืนระหว่างกระบวนการต่างๆ และช่วยได้มากในการใช้มัลติเธรดภายในโปรแกรม เช่น การสร้างหลายเธรดและการซิงโครไนซ์การดำเนินการ ภายในคู่มือนี้วันนี้ คุณจะเห็นภาพประกอบง่ายๆ ของการใช้สัญญาณ POSIX ใน C สำหรับตัวอย่างโค้ด C พื้นฐาน เราต้องกำหนดค่าคอมไพเลอร์ในระบบ แต่ก่อนหน้านั้น เราจำเป็นต้องอัปเดตระบบ เนื่องจากเป็นขั้นตอนที่จำเป็นสำหรับการดำเนินการโค้ดที่ราบรื่น ดังนั้น แบบสอบถามที่แสดงใน snap ที่แนบมาจึงเป็นสิ่งจำเป็นในการอัปเดตและอัปเกรดระบบปฏิบัติการ Linux ของคุณด้วยยูทิลิตี้ 'apt'


กระบวนการนี้ต้องการพื้นที่ประมาณ 55 Kb บนแพลตฟอร์ม Linux ของคุณเพื่อดำเนินการอัปเดตอย่างราบรื่น หากคุณต้องการที่จะให้พื้นที่มากขนาดนั้น ให้แตะ 'y' เพื่อดำเนินการต่อ การประมวลผลจะเสร็จสิ้นภายในไม่กี่นาที








หลังจากที่ระบบได้รับการอัพเกรดอย่างสมบูรณ์แล้ว เราจะกำหนดค่าคอมไพเลอร์ของภาษา C ในระบบของเราด้วยยูทิลิตี้ apt-get ในคำสั่ง 'ติดตั้ง' ใช้ “gcc” เป็นคีย์เวิร์ด เท่านี้ก็เรียบร้อย





sem_init()

สัญญาณใหม่จะถูกสร้างขึ้นเมื่อมีสัญญาณที่ 's' ที่ไม่ปรากฏชื่ออยู่แล้ว ไม่เช่นนั้นสัญญาณที่มีอยู่แล้วจะถูกยกเลิก ตลอดวิธีการนี้ “s” ย่อมาจาก Semaphore instance ที่สร้างขึ้น และแบ่งปันเป็นสัญญาณหรือธงที่ระบุว่าสัญญาณอาจถูกแจกจ่ายด้วยวิธี forked() หรืออย่างอื่น ค่าอินพุตทำหน้าที่เป็นจุดเริ่มต้นที่กำหนดไว้ของสัญญาณ





Int sem_init ( nor_t * s, int ที่ใช้ร่วมกัน, มูลค่า int ที่ไม่ได้ลงนาม ) ;

Sem_wait()

โดยดำเนินการล็อกสัญญาณกับสัญญาณที่ระบุโดย 's' เมธอด sem_wait() จะเก็บสัญญาณนั้นไว้ ขั้นตอน sem-wait จะใช้เพื่อเก็บสัญญาณหรือปล่อยให้อยู่ในสาย กระบวนการโอเวอร์โหลดก่อนหน้านี้บางส่วนจะตื่นขึ้นเมื่อกระบวนการอื่นเรียกใช้ sem_post()



int sem_wait ( nor_t * ) ;

no_post()

เมื่อมีการเรียก sem post ค่าจะเพิ่มขึ้น จากนั้นหนึ่งในการดำเนินการสำรองหรือรอดำเนินการที่สำรองไว้ก่อนหน้านี้เริ่มทำงาน กล่าวคือ ปลดล็อกสัญญาณที่ล็อกไว้แล้ว

int sem_post ( nor_t * ) ;

no_destroy()

semaphore ที่ไม่มีชื่อเริ่มต้นจะถูกทำลายโดยใช้ฟังก์ชัน sem destroy()

int sem_destroy ( nor_t * ) ;

ตัวอย่าง

เพื่อให้เข้าใจเซมาฟอร์ เราจะสร้างไฟล์ C ก่อนแล้วจึงเพิ่มโค้ดลงไป หากต้องการสร้างไฟล์ ให้ใช้คำสั่ง 'แตะ' แล้วคุณจะพบไฟล์ใหม่ในโฟลเดอร์เริ่มต้นของระบบ


ตอนนี้ คุณต้องเปิดไฟล์ C เปล่าด้วยโปรแกรมแก้ไขง่ายๆ เพื่อสร้างโค้ดที่ดี เราได้ลองใช้ตัวแก้ไข 'นาโน' มาจนถึงตอนนี้ ดังที่แสดงในภาพด้านล่าง


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

ในการใช้ไลบรารีเหล่านี้ในโค้ด เราต้องใช้อักขระ '#' พร้อมคีย์เวิร์ด 'include' สำหรับแต่ละไลบรารี ตอนนี้เราได้เพิ่มไลบรารี่ทั้งหมด 4 ไลบรารีที่ต้องมีในโปรแกรมนี้ มิฉะนั้น โปรแกรมของเราจะทำงานไม่ถูกต้อง ไลบรารีส่วนหัว 'stdio.h' แรกมักเป็นสิ่งที่ต้องมีในทุกโปรแกรม C เพราะช่วยให้เรามีการดำเนินการอินพุตและเอาต์พุตในโค้ด ดังนั้นเราจึงใช้มันเพื่อเพิ่มอินพุตและรับเอาต์พุตจากโค้ดได้อย่างราบรื่น ไลบรารีที่สองที่เราใช้ที่นี่คือ “pthread.h” ซึ่งจำเป็นสำหรับการใช้การเขียนโปรแกรมเธรด เช่น มัลติเธรด

เราจะใช้ไลบรารีนี้เพื่อสร้างเธรดในโปรแกรม ไลบรารีถัดไปและสำคัญที่สุดในโค้ดนี้คือ 'semaphore.h' มันถูกใช้เพื่อซิงโครไนซ์เธรดอย่างราบรื่น สุดท้ายแต่ไม่ท้ายสุด ไลบรารีคือ 'unistd.h' ซึ่งช่วยให้เราใช้ฟังก์ชันเบ็ดเตล็ดและค่าคงที่ที่ผู้ใช้กำหนด ตอนนี้ เราได้ประกาศสัญญาณ 's' โดยใช้วัตถุในตัว 'sem_t' ของไลบรารีสัญญาณ ฟังก์ชันที่ผู้ใช้กำหนดเองของเธรดมาถึง 'T' โดยไม่มีประเภทส่งคืน มีการใช้ฟังก์ชันสัญญาณเสียงในตัวเพื่อทำการซิงโครไนซ์ ฟังก์ชัน sem_wait() ใช้สำหรับเก็บเครื่องหมาย 's' โดยใช้อักขระ '&'

ภายในการระงับ คำสั่ง printf() จะถูกดำเนินการพร้อมกับฟังก์ชัน 'sleep' เพื่อให้โปรแกรมนี้อยู่ในโหมดสลีปเป็นเวลา 4 วินาที คำสั่ง printf() อื่นจะแสดงข้อความใหม่และฟังก์ชัน sem_post() จะถูกดำเนินการเพื่อปลดล็อคสัญญาณ 's'

#include
#include
#include
#include
not_t s;
โมฆะ * ตู่ ( โมฆะ * arg ) {
sem_wait ( & ) ;
printf ( 'ยินดีต้อนรับ! \n ' ) ;
นอน ( 4 ) ;
printf ( 'บาย! \n ' ) ;
sem_post ( & ) ;
}



มาดูวิธีการ main() ของโปรแกรม C นี้สำหรับสัญญาณ ฟังก์ชัน sem_init() ถูกใช้ที่นี่เพื่อสร้าง semaphore “s” ใหม่ที่ยังไม่ได้แจกจ่ายด้วยวิธี forked() เช่น “0” และตั้งค่าจุดเริ่มต้นเป็น 1 วัตถุ pthread_t จาก pthread ไลบรารีของ C ถูกใช้เพื่อสร้างสองเธรดโดยใช้วัตถุสองเธรด o1 และ o2 คำสั่ง printf() อยู่ที่นี่เพื่อแสดงว่าเรากำลังจะสร้างเธรดแรกโดยใช้ฟังก์ชัน pthread_create() ในบรรทัดถัดไป

เราได้ส่งออบเจ็กต์เธรด o1 ไปยังฟังก์ชันนี้โดยมีข้อ จำกัด NULL และเรียกใช้ฟังก์ชัน 'T' โดยส่งผ่านในพารามิเตอร์ หลังจากสลีป 4 วินาที  เธรดอื่นถูกสร้างขึ้นด้วยอ็อบเจ็กต์ o2 และฟังก์ชัน pthread_join() จะถูกใช้ที่นี่เพื่อรวมเธรดด้วยฟังก์ชัน main() ฟังก์ชัน sem_destroy() อยู่ที่นี่เพื่อทำลายสัญญาณ 's' และเธรดที่ถูกบล็อกทั้งหมดก็จะถูกปล่อยออกมาเช่นกัน

int หลัก ( ) {
sem_init ( & s, 0 , 1 ) ;
pthread_t o1, o2;
printf ( “ในกระทู้ที่ 1 ตอนนี้... \n ' ) ;
pthread_create ( & o1,NULL,T,NULL ) ;
นอน ( 4 ) ;
printf ( “ในกระทู้ที่ 2 ตอนนี้... \n ' ) ;
pthread_create ( & o2,NULL,T,NULL ) ;
pthread_join ( o1,NULL ) ;
pthread_join ( o2,NULL ) ;
no_destroy ( & ) ;
กลับ 0 ;
}



เรากำลังรวบรวมโปรแกรม C ด้วยคอมไพเลอร์ 'Gcc'; ตัวเลือก '-lrt' และ '-lpthread' ใช้สำหรับเรียกใช้ฟังก์ชันเธรด POSIX เมื่อเรียกใช้แบบสอบถาม '.a/.out' เธรดแรกจะถูกสร้างขึ้น มันเข้าสู่โหมดสลีปหลังจากพิมพ์ข้อความแรก


เธรดที่สองได้รับการซิงโครไนซ์ และหลังจากนั้น 4 วินาที เธรดแรกจะถูกปล่อย และเธรดที่สองก็ถูกล็อคเป็นเวลา 4 วินาที


ในที่สุด เธรดที่สองก็ถูกปล่อยออกมา

บทสรุป

เกี่ยวกับ POSIX Semaphores ใน C ในขณะที่ใช้ฟังก์ชันหลักบางอย่างเพื่อซิงโครไนซ์เธรดต่างๆ หลังจากอ่านบทความนี้แล้ว คุณจะเข้าใจ POSIX มากขึ้นเรื่อยๆ