ฟังก์ชั่น Sleep() ในภาษา C

Fang Kchan Sleep Ni Phas A C



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

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

ในบทความ Linuxhint นี้ คุณจะได้เรียนรู้วิธีใช้ฟังก์ชัน sleep() เพื่อสร้างความล่าช้าแบบเรียลไทม์ เราจะแสดงไวยากรณ์และคำอธิบายของฟังก์ชันนี้ รวมถึงตัวเลือกที่ POSIX จัดเตรียมไว้เพื่อสร้างความล่าช้าที่มีเศษส่วนน้อยกว่าหนึ่งวินาที จากนั้น เราจะแสดงวิธีชะลอการทำงานของโปรแกรมและผลกระทบของสัญญาณต่อฟังก์ชันนี้โดยใช้ตัวอย่าง โค้ด และรูปภาพที่ใช้งานได้จริง








ไวยากรณ์ของฟังก์ชัน Sleep() ในภาษา C



ไม่ได้ลงนาม ภายใน นอน ( ไม่ได้ลงนาม ภายใน วินาที )

คำอธิบายของฟังก์ชัน Sleep() ในภาษา C

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



ฟังก์ชันนี้มักใช้เพื่อบังคับใช้ความล่าช้าที่ยาวนานมากกว่า 1 วินาทีในการดำเนินการตามกระบวนการแบบเรียลไทม์ สำหรับความล่าช้าน้อยกว่า 1 วินาที POSIX จัดเตรียมฟังก์ชันความละเอียดระดับไมโครวินาที usleep() ซึ่งใช้การเรียกเมธอดเดียวกันกับ sleep() สำหรับความล่าช้าที่น้อยกว่า 1 ไมโครวินาที ยังมีฟังก์ชัน nanosleep() ที่มีความละเอียด 1 นาโนวินาที แต่มีวิธีการโทรที่แตกต่างออกไป โดยจะใช้โครงสร้าง 'timespec' เป็นอาร์กิวเมนต์อินพุตเพื่อตั้งเวลาหน่วง





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

ฟังก์ชั่น sleep() ถูกกำหนดไว้ในส่วนหัว “unistd.h” หากต้องการใช้งาน เราจำเป็นต้องรวมไฟล์นี้ไว้ในโค้ดดังนี้:



#รวม

วิธีการแนะนำความล่าช้าในกระบวนการด้วยฟังก์ชัน Sleep()

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

ในการดำเนินการนี้ เราใช้ไฟล์ว่างที่มีนามสกุล '.c' และเพิ่มส่วนหัว 'stdio.h' และ 'unistd.h' ลงไป จากนั้นเราจะเปิดฟังก์ชัน main() ที่ว่างเปล่าและกำหนดตัวแปรวินาทีของประเภท int ซึ่งเราจะใช้เป็นตัวนับสำหรับเวลาที่ผ่านไป

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

#รวม
#รวม

เป็นโมฆะ หลัก ( )
{
ภายใน วินาที = 0 ;
ในขณะที่ ( 1 )
{
พิมพ์ฉ ( 'เวลาที่ผ่านไป: %i \n ' , วินาที ) ;
วินาที += 2 ;
นอน ( 2 ) ;
}

}

ต่อไปนี้เราจะเห็นภาพพร้อมการคอมไพล์และเรียกใช้โค้ดนี้ ดังที่เราเห็น ทุก 2 วินาที โปรแกรมจะพิมพ์วินาทีที่ผ่านไปบนหน้าจอนับตั้งแต่ดำเนินการตามกระบวนการ

ผลของสัญญาณต่อฟังก์ชัน Sleep()

ในตัวอย่างนี้ เราต้องการสังเกตผลกระทบของสัญญาณต่อกระบวนการที่เข้าสู่โหมดสลีปโดยใช้ฟังก์ชัน sleep() เมื่อต้องการทำเช่นนี้ เราสร้างแอปพลิเคชันง่ายๆ ที่ประกอบด้วยฟังก์ชัน main() และตัวจัดการสำหรับสัญญาณ 36

ในบรรทัดแรกของฟังก์ชัน main() เราจะประกาศตัวแปรที่เหลือประเภท int โดยที่เราเก็บค่าที่ส่งคืนโดยฟังก์ชัน sleep() จากนั้น เราใช้ฟังก์ชัน signal() เพื่อผูกตัวจัดการกับสัญญาณ 36 ในบรรทัดถัดไป เราจะแสดง PID ของกระบวนการที่เราใช้เพื่อส่งสัญญาณจากเชลล์ที่สองไปยังกระบวนการ ในที่สุด เราเรียกใช้ฟังก์ชัน sleep() และตั้งค่าอาร์กิวเมนต์อินพุตเป็น 60 วินาที ซึ่งนานพอที่จะส่งสัญญาณจากเชลล์ที่สอง เราส่งตัวแปรที่เหลือเป็นอาร์กิวเมนต์เอาต์พุตไปที่ sleep()

ตัวจัดการที่แนบกับสัญญาณ 36 ประกอบด้วยบรรทัดของโค้ดที่ฟังก์ชัน printf() พิมพ์ข้อความ “เวลาที่เหลือ:” ตามด้วยค่าที่ส่งคืนโดย sleep() ณ เวลาที่สัญญาณมาถึงที่กระบวนการ มาดูโค้ดสำหรับตัวอย่างนี้กัน

#รวม
#รวม
#รวม
#รวม

เป็นโมฆะ ตัวจัดการ ( ภายใน ที่เหลืออยู่ ) ;

เป็นโมฆะ หลัก ( )
{
ภายใน ที่เหลืออยู่ ;
สัญญาณ ( 36 , ตัวจัดการ ) ;
พิมพ์ฉ ( 'รหัสกระบวนการ: %i \n ' , เก็ทพิด ( ) ) ;
ที่เหลืออยู่ = นอน ( 60 ) ;
}

เป็นโมฆะ ตัวจัดการ ( ภายใน ที่เหลืออยู่ )

{
พิมพ์ฉ ( 'เวลาที่เหลืออยู่: %i \n ' , ที่เหลืออยู่ ) ;
}

รูปภาพต่อไปนี้ที่เราเห็นแสดงการรวบรวมและการดำเนินการของโค้ดนี้:

หากต้องการดูผลกระทบของสัญญาณในกระบวนการนี้ เรารวบรวมโค้ดนี้และรัน จากนั้น จากเทอร์มินัลที่สอง เราจะส่งสัญญาณด้วยไวยากรณ์ต่อไปนี้:

ฆ่า - - n สัญญาณ PID

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

บทสรุป

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

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