Secara umum, saya kira Anda tidak bisa. (Beberapa sistem operasi mungkin menyediakannya, tetapi saya tidak mengetahui yang saya tahu mendukung hal ini.)
Referensi dokumen untuk batas sumber daya: getrlimit
dari POSIX 2008.
Ambil contoh batas CPU RLIMIT_CPU
.
- Jika proses melebihi batas lunak, itu akan dikirim a
SIGXCPU
- Jika prosesnya melebihi batas yang keras, prosesnya menjadi sederhana
SIGKILL
Jika Anda dapat wait()
mengikuti program Anda, Anda dapat mengetahui apakah program tersebut dibunuh oleh SIGXCPU
. Tetapi Anda tidak dapat membedakan SIGKILL
pengiriman yang dikirim untuk pelanggaran batas keras dari pembunuhan lama biasa dari luar. Terlebih lagi, jika program menangani XCPU
, Anda bahkan tidak akan melihatnya dari luar.
Hal yang sama untuk RLIMIT_FSIZE
. Anda dapat melihat SIGXFSZ
dari wait()
statusnya jika program tidak menanganinya. Tetapi begitu batas ukuran file terlampaui, satu-satunya hal yang terjadi adalah I / O lebih lanjut yang mencoba menguji batas itu hanya akan diterima EFBIG
- ini akan ditangani (atau tidak, sayangnya) oleh program secara internal. Jika program ini menangani SIGXFSZ
, sama seperti di atas - Anda tidak akan mengetahuinya.
RLIMIT_NOFILE
? Yah, Anda bahkan tidak mendapat sinyal. open
dan teman-teman kembali EMFILE
ke program. Itu tidak terganggu, sehingga akan gagal (atau tidak) dengan cara apa pun yang dikodekan untuk gagal dalam situasi itu.
RLIMIT_STACK
? Bagus SIGSEGV
, tidak dapat dibedakan dari skor alasan lain untuk dikirim. (Kamu akan tahu bahwa itu yang membunuh prosesnya, dari wait
status.)
RLIMIT_AS
dan RLIMIT_DATA
hanya akan membuat malloc()
dan beberapa orang lain mulai gagal (atau menerima SIGSEGV
jika batas AS terpukul saat mencoba memperluas tumpukan di Linux). Kecuali jika program ini ditulis dengan sangat baik, itu mungkin akan gagal secara acak pada saat itu.
Jadi singkatnya, secara umum, kegagalan tidak tampak berbeda dari alasan kematian proses lainnya, jadi Anda tidak bisa yakin, atau dapat ditangani sepenuhnya dari program dalam hal ini memutuskan apakah / kapan / bagaimana hasilnya, bukan Anda dari luar.
Yang terbaik yang dapat Anda lakukan sejauh yang saya tahu adalah menulis sedikit kode yang memotong program Anda, menunggu, dan:
- periksa status keluar untuk mendeteksi
SIGXCPU
dan SIGXFSZ
(AFAIK, sinyal-sinyal itu hanya akan dihasilkan oleh OS untuk masalah batas sumber daya). Bergantung pada kebutuhan Anda yang sebenarnya, Anda dapat mengasumsikan itu SIGKILL
dan SIGSEGV
juga terkait dengan batas sumber daya, tetapi itu agak sulit.
- lihat apa yang bisa Anda dapatkan dari
getrusage(RUSAGE_CHILDREN,...)
implementasi Anda untuk mendapatkan petunjuk tentang yang lain.
Fasilitas khusus OS mungkin ada untuk membantu di sini (mungkin hal-hal seperti ptrace
di Linux, atau Solaris dtrace
), atau mungkin teknik tipe debugger, tetapi itu akan lebih terikat dengan implementasi spesifik Anda.
(Aku berharap orang lain akan menjawab dengan hal ajaib yang sama sekali tidak kusadari.)
malloc
tapi sayangnya itu tidak menyelesaikan masalah memori secara umum, karena secara umum ini tentang panggilan sistembrk
(apakah saya benar?).LD_PRELOAD
ing bahwa ini batas untuk Anda "tidak memodifikasi proses" kendala, dan itu akan membantu sedikit, tetapi tidak benar-benar -malloc
,brk
,sbrk
danmmap
akan gagal denganENOMEM
, persis seperti jika Anda benar-benar berada dalam situasi memori rendah (tetapi jauh di bawah batas memori). Batas waktu adalahRLIMIT_CPU
, saya tidak tahu batas waktu jam dinding.brk
. Seperti yang saya lihat, persyaratan 'program tidak menangani sinyal X, Y, Z ...' akan menyelesaikan masalah SIGXCPU, SIGXFSZ, SIGSEGV, terima kasih kepada waitpid (Jika saya salah, perbaiki saya).brk
. Seperti yang saya lihat, persyaratan 'program tidak menangani sinyal X, Y, Z ...' akan menyelesaikan masalah SIGXCPU, SIGXFSZ, SIGSEGV, terima kasih kepada waitpid. Apakah saya benar?Saat ini saya sedang melakukan beberapa pekerjaan pada masalah yang sama. Saya sudah dapat memiliki solusi parsial untuk itu. Saya telah menggunakan susbsystem audit . Anda dapat melacak pekerjaan di [1].
[1] https://github.com/PaulDaviesC/Logging-limits.conf
sumber