โดยทั่วไปแล้วฉันไม่คิดว่าคุณจะโชคร้าย (ระบบปฏิบัติการบางระบบอาจมีให้ แต่ฉันไม่ทราบถึงสิ่งที่ฉันรู้ว่าสนับสนุน)
เอกสารอ้างอิงสำหรับข้อ จำกัด ทรัพยากร: 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 อาจมีอยู่เพื่อช่วยเหลือที่นี่ (อาจเป็นเช่นptraceLinux หรือ Solaris dtrace) หรืออาจเป็นเทคนิคการดีบั๊กชนิดหนึ่ง
(ฉันหวังว่าคนอื่นจะตอบด้วยเวทมนตร์บางอย่างที่ฉันไม่รู้)
mallocแต่น่าเสียดายที่มันไม่ได้แก้ปัญหาหน่วยความจำโดยทั่วไปทำให้เกิดโดยทั่วไปเกี่ยวกับการโทรของระบบbrk(ฉันใช่ไหม?)