Genel olarak, ne yazık ki yapabileceğinizi sanmıyorum. (Bazı işletim sistemleri bunu sağlayabilir, ancak bunu desteklediğini bildiklerimin farkında değilim.)
Kaynak sınırları için referans dokümanı: getrlimit
POSIX 2008'den.
Örneğin CPU limitini ele alalım RLIMIT_CPU
.
- İşlem yumuşak sınırı aşarsa,
SIGXCPU
- Süreç zor sınırı aşarsa,
SIGKILL
wait()
Programınız üzerinde yapabiliyorsanız , tarafından öldürülüp öldürülmediğini anlayabilirsiniz SIGXCPU
. Ancak SIGKILL
, sert sınırın ihlali nedeniyle gönderilen bir gönderimi dışarıdan gelen eski bir öldürmeden ayırt edemezdiniz . Dahası, program ele alırsa XCPU
, bunu dışarıdan bile göremezsiniz.
Aynı şey RLIMIT_FSIZE
. Program işlemezse SIGXFSZ
, wait()
durumunu görebilirsiniz . Ancak dosya boyutu sınırı aşıldığında, gerçekleşen tek şey, bu sınırı tekrar test etmeye çalışan daha fazla I / O'nun basitçe alacağıdır EFBIG
- bu, program tarafından dahili olarak ele alınacaktır (veya maalesef değil). Program SIGXFSZ
yukarıdaki gibi çalışıyorsa, bunu bilmezsiniz.
RLIMIT_NOFILE
? Bir sinyal bile almýyorsun. open
ve arkadaşlar EMFILE
programa geri dönüyorlar . Aksi halde rahatsız edilmez, bu nedenle bu durumda başarısız olacak şekilde kodlanırsa başarısız olur (veya olmaz).
RLIMIT_STACK
? İyi yaşlı SIGSEGV
, bir tane almak için diğer nedenlerin puanından ayırt edilemez. (Ancak, durumdan süreci öldüren şeyin bu olduğunu bileceksiniz wait
.)
RLIMIT_AS
ve RLIMIT_DATA
sadece malloc()
birkaçı başarısız olur ve başarısızlık başlar (veya SIGSEGV
Linux'ta yığını genişletmeye çalışırken AS sınırına ulaşılırsa alır). Program çok iyi yazılmadığı sürece, muhtemelen bu noktada oldukça rastgele başarısız olacaktır.
Kısacası, genel olarak, başarısızlıklar ya diğer süreç ölüm nedenlerinden gözle görülür şekilde farklı değildir, bu yüzden emin olamazsınız ya da tamamen programdan ele alınabilir, bu durumda eğer değil, ne zaman / nasıl ilerlediğine karar verir, dışarıdan.
Bildiğim kadarıyla yapabileceğiniz en iyi program çatalları, üzerinde bekleyen kod biraz yazmak ve:
- algılanacak çıkış durumunu kontrol edin
SIGXCPU
ve SIGXFSZ
(AFAIK, bu sinyaller yalnızca işletim sistemi tarafından kaynak sınırı sorunları için üretilecektir). Tam ihtiyaçları bağlı olarak, farz olabilir SIGKILL
ve SIGSEGV
aynı zamanda kaynak limitleri ile ilgili idi, ama bu streç biraz bu.
getrusage(RUSAGE_CHILDREN,...)
diğerleri hakkında bir ipucu almak için uygulamanızdan neler elde edebileceğinize bakın .
İşletim sistemine özgü tesisler burada yardımcı olabilir (muhtemelen ptrace
Linux veya Solaris gibi şeyler dtrace
) veya muhtemelen hata ayıklayıcı türü teknikler olabilir, ancak bu sizin özel uygulamanızla daha da bağlantılı olacaktır.
(Başka birinin tamamen bilmediğim sihirli bir şeyle cevap vermesini umuyorum.)
malloc
ama maalesef genel olarak hafıza problemini çözmüyor, çünkü genel olarak sistem çağrısı ile ilgilibrk
(doğru mu?).