โดยทั่วไปแล้วฉันไม่คิดว่าคุณจะโชคร้าย (ระบบปฏิบัติการบางระบบอาจมีให้ แต่ฉันไม่ทราบถึงสิ่งที่ฉันรู้ว่าสนับสนุน)
เอกสารอ้างอิงสำหรับข้อ จำกัด ทรัพยากร: getrlimit
จาก POSIX 2008
RLIMIT_CPU
ใช้ตัวอย่างเช่นขีด จำกัด ของ CPU
- หากกระบวนการเกินขีด จำกัด ซอฟท์แวร์นั้นจะถูกส่งไป
SIGXCPU
- หากกระบวนการเกินขีด จำกัด ฮาร์ดจะได้รับธรรมดา
SIGKILL
หากคุณสามารถเกี่ยวกับโปรแกรมของคุณคุณสามารถบอกได้ว่ามันถูกฆ่าตายโดยwait()
SIGXCPU
แต่คุณไม่สามารถแยกแยะความแตกต่างที่SIGKILL
ถูกส่งไปเพื่อฝ่าฝืนข้อ จำกัด อย่างหนักจากการฆ่าแบบธรรมดาจากภายนอก ยิ่งไปกว่านั้นหากโปรแกรมจัดการกับXCPU
คุณจะไม่เห็นเลยว่าจากภายนอก
RLIMIT_FSIZE
สิ่งเดียวกันสำหรับ คุณสามารถดูSIGXFSZ
จากwait()
สถานะหากโปรแกรมไม่จัดการ แต่เมื่อเกินขีด จำกัด ขนาดไฟล์สิ่งเดียวที่เกิดขึ้นคือ I / O เพิ่มเติมที่พยายามทดสอบขีด จำกัด นั้นอีกครั้งจะได้รับเพียงอย่างEFBIG
เดียว - สิ่งนี้จะได้รับการจัดการ (หรือไม่น่าเสียดาย) โดยโปรแกรมภายใน หากโปรแกรมจัดการSIGXFSZ
เช่นเดียวกับด้านบน - คุณจะไม่รู้เกี่ยวกับมัน
RLIMIT_NOFILE
? คุณไม่ได้รับสัญญาณด้วยซ้ำ open
และเพื่อน ๆ ก็กลับEMFILE
ไปที่โปรแกรม มันไม่ได้ใส่ใจเป็นอย่างอื่นดังนั้นมันจะล้มเหลว (หรือไม่) ไม่ว่าด้วยวิธีใดก็ตามที่มีการกำหนดให้ล้มเหลวในสถานการณ์นั้น
RLIMIT_STACK
? ดีมากSIGSEGV
ไม่สามารถแยกความแตกต่างจากคะแนนของเหตุผลอื่นเพื่อให้ได้รับมอบ (คุณจะรู้ว่านั่นคือสิ่งที่ฆ่ากระบวนการแม้ว่าจากwait
สถานะ)
RLIMIT_AS
และRLIMIT_DATA
จะทำmalloc()
และคนอื่น ๆ จะเริ่มล้มเหลว (หรือรับSIGSEGV
ถ้าขีด จำกัด AS ถูกกระทบในขณะที่พยายามขยายสแต็กบน Linux) ถ้าโปรแกรมนั้นเขียนได้ดีมากมันอาจจะล้มเหลวแบบสุ่มพอสมควร ณ จุดนั้น
ดังนั้นโดยทั่วไปความล้มเหลวอาจไม่แตกต่างอย่างเห็นได้ชัดจากเหตุผลการเสียชีวิตของกระบวนการอื่นดังนั้นคุณจึงไม่สามารถมั่นใจได้หรือสามารถจัดการได้อย่างสมบูรณ์จากโปรแกรมในกรณีที่มันตัดสินใจว่า / เมื่อ / วิธีการดำเนินการไม่ใช่คุณ จากด้านนอก.
สิ่งที่ดีที่สุดที่คุณสามารถทำได้เท่าที่ฉันรู้ก็คือเขียนโค้ดที่ใช้ในโปรแกรมของคุณรออยู่และ:
- ตรวจสอบสถานะการออกเพื่อตรวจจับ
SIGXCPU
และSIGXFSZ
(AFAIK สัญญาณเหล่านั้นจะถูกสร้างขึ้นโดยระบบปฏิบัติการสำหรับปัญหาการ จำกัด ทรัพยากร) ขึ้นอยู่กับความต้องการที่แน่นอนของคุณคุณสามารถสันนิษฐานได้SIGKILL
และSIGSEGV
เกี่ยวข้องกับข้อ จำกัด ของทรัพยากร แต่นั่นก็เป็นเรื่องเล็กน้อย
- ดูสิ่งที่คุณสามารถทำได้จาก
getrusage(RUSAGE_CHILDREN,...)
การนำไปใช้ของคุณเพื่อรับคำแนะนำเกี่ยวกับสิ่งอื่น
สิ่งอำนวยความสะดวกเฉพาะสำหรับ OS อาจมีอยู่เพื่อช่วยเหลือที่นี่ (อาจเป็นเช่นptrace
Linux หรือ Solaris dtrace
) หรืออาจเป็นเทคนิคการดีบั๊กชนิดหนึ่ง
(ฉันหวังว่าคนอื่นจะตอบด้วยเวทมนตร์บางอย่างที่ฉันไม่รู้)
malloc
แต่น่าเสียดายที่มันไม่ได้แก้ปัญหาหน่วยความจำโดยทั่วไปทำให้เกิดโดยทั่วไปเกี่ยวกับการโทรของระบบbrk
(ฉันใช่ไหม?)