উত্তর:
লিনাক্সের অধীনে, আপনি আপনার প্রক্রিয়াটির পিআইডি খুঁজে পেতে পারেন, তারপরে দেখুন /proc/$PID/status
। এটিতে এমন লাইন রয়েছে যা বর্ণনা করে যে কোন সিগন্যালগুলি অবরুদ্ধ রয়েছে (সিগব্লক), উপেক্ষা করা হবে (সিগআইগন), বা ধরা পড়েছে (সিগসিজিটি)।
# cat /proc/1/status
...
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
...
ডানদিকে সংখ্যাটি বিটমাস্ক। আপনি বাইনারিতে হেক্স থেকে এটা রূপান্তর করেন, তাহলে প্রতিটি 1-বিট, একটি ধরা সংকেত প্রতিনিধিত্ব করে তাই SigCgt লাইন ব্যাখ্যা দ্বারা অধিকার 1. দিয়ে শুরু বাম থেকে গণনা, আমরা দেখতে পারি যে আমার init
প্রক্রিয়া নিম্নলিখিত সংকেত সংক্রামক হয়:
00000000280b2603 ==> 101000000010110010011000000011
| | | || | || |`-> 1 = SIGHUP
| | | || | || `--> 2 = SIGINT
| | | || | |`----------> 10 = SIGUSR1
| | | || | `-----------> 11 = SIGSEGV
| | | || `--------------> 14 = SIGALRM
| | | |`-----------------> 17 = SIGCHLD
| | | `------------------> 18 = SIGCONT
| | `--------------------> 20 = SIGTSTP
| `----------------------------> 28 = SIGWINCH
`------------------------------> 30 = SIGPWR
(আমি kill -l
বাশ থেকে চালিয়ে নাম্বার-টু-নাম ম্যাপিং পেয়েছি))
সম্পাদনা : এবং পজিক্স শ মধ্যে জনপ্রিয় চাহিদা, একটি স্ক্রিপ্ট by
sigparse () {
i=0
# bits="$(printf "16i 2o %X p" "0x$1" | dc)" # variant for busybox
bits="$(printf "ibase=16; obase=2; %X\n" "0x$1" | bc)"
while [ -n "$bits" ] ; do
i="$(expr "$i" + 1)"
case "$bits" in
*1) printf " %s(%s)" "$(kill -l "$i")" "$i" ;;
esac
bits="${bits%?}"
done
}
grep "^Sig...:" "/proc/$1/status" | while read a b ; do
printf "%s%s\n" "$a" "$(sigparse "$b")"
done # | fmt -t # uncomment for pretty-printing
/proc
? এটি কেবল লিনাক্সে কাজ করবে ... এবং local
পসিক্স নয়। ঠিক আছে, এটি কিন্ডা তবে এর প্রভাবটি "অনির্ধারিত"।
/bin/sh
। আপনি ঠিক বলেছেন local
; আমি এটি পরিষ্কার করব।
সোলারিসে, psig
সংকেতগুলির তালিকা এবং সেগুলি কীভাবে পরিচালনা করা হবে তা পেতে প্রক্রিয়া আইডিতে চালান ।
এই ক্ষেত্রে:
bash-4.2$ psig $$
11088: bash
HUP caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
INT caught sigint_sighandler 0
QUIT ignored
ILL caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
TRAP caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
ABRT caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
EMT caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
FPE caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
KILL default
BUS caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
SEGV caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
SYS caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
PIPE caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
ALRM caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
TERM ignored
USR1 caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
USR2 caught termsig_sighandler 0 HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
CLD blocked,caught 0x4898e8 RESTART
PWR default
WINCH caught sigwinch_sighandler 0
[...]
যা দেখায় যে সিগআপ, সিগিল ইত্যাদি সমস্ত একই সিগন্যাল হ্যান্ডলার ফাংশনটির দ্বারা ধরা পড়বে termsig_sighandler
, যেগুলির মাধ্যমে নির্ধারিত কোনও পতাকা ব্যবহার না করে চালানো sigaction
হবে এবং সিগন্যাল হ্যান্ডলার থাকাকালীন সমস্ত সংকেত অস্থায়ীভাবে মুখোশযুক্ত হবে all চলমান (এক্ষেত্রে সমস্ত একই সিগন্যাল হ্যান্ডলার ব্যবহার করে, সুতরাং এটি ইতিমধ্যে চলাকালীন পুনরায় সাজানো হয়নি)। এছাড়াও আপনি দেখতে পাবেন যে সিকুইট এবং সিগন্টর এড়িয়ে যাওয়া হবে, সিগ্কিল এবং সিগ্পডাব্লুআর সিস্টেম ডিফল্ট সিগন্যাল ক্রিয়াগুলি ব্যবহার করে এবং সিগসিএলডি রিস্টার্ট পতাকা নির্দিষ্ট করে, তাই যদি এটির সিগন্যাল হ্যান্ডলারটি কোনও সিস্টেম কলকে বাধা দেয়, সিস্কেলটি পুনরায় চালু হবে।
(এই উত্তরটি @ ব্যবহারকারী18096 এর উত্তরের অনুরূপ, এটি @ জান্দারের উত্তরকে ঘিরে একটি লিপি তৈরি করে))
আমি psig script
একটি পিআইডি (বা সমস্ত পিআইডি) নিতে এবং সিগন্যাল মাস্কগুলি থেকে মানব-পঠনযোগ্য আউটপুট তৈরি করতে একটি লিখেছি /proc/<PID>/status
।
উদাহরণ আউটপুট:
% ./psig -a
[ 1] Signals Queued: 8/773737
[ 1] Signals Pending:
[ 1] Signals Pending (Shared):
[ 1] Signals Blocked:
[ 1] Signals Ignored: SIGPIPE
[ 1] Signals Caught: SIGHUP,SIGINT,SIGABRT,SIGUSR1,SIGSEGV,SIGALRM,SIGTERM,SIGCHLD,SIGPWR
...
[ 31001] Signals Queued: 0/773737
[ 31001] Signals Pending:
[ 31001] Signals Pending (Shared):
[ 31001] Signals Blocked: SIGHUP,SIGINT,SIGQUIT,SIGILL,SIGTRAP,SIGABRT,SIGBUS,SIGFPE,SIGUSR1,SIGUSR2,SIGPIPE,SIGALRM,SIGTERM,SIGSTKFLT,SIGCHLD,SIGCONT,SIGTSTP,SIGTTIN,SIGTTOU,SIGURG,SIGXCPU,SIGXFSZ,SIGPROF,SIGWINCH,SIGIO,SIGPWR,SIGSYS,SIGRTMIN,SIGRTMIN+1,SIGRTMIN+2,SIGRTMIN+3,SIGRTMIN+4,SIGRTMIN+5,SIGRTMIN+6,SIGRTMIN+7,SIGRTMIN+8,SIGRTMIN+9,SIGRTMIN+10,SIGRTMIN+11,SIGRTMIN+12,SIGRTMIN+13,SIGRTMIN+14,SIGRTMIN+15,SIGRTMAX-14,SIGRTMAX-13,SIGRTMAX-12,SIGRTMAX-11,SIGRTMAX-10,SIGRTMAX-9,SIGRTMAX-8,SIGRTMAX-7,SIGRTMAX-6,SIGRTMAX-5,SIGRTMAX-4,SIGRTMAX-3,SIGRTMAX-2,SIGRTMAX-1,SIGRTMAX
[ 31001] Signals Ignored: SIGHUP,SIGINT,SIGQUIT,SIGPIPE,SIGXFSZ
[ 31001] Signals Caught: SIGBUS,SIGUSR1,SIGSEGV,SIGUSR2,SIGALRM,SIGTERM,SIGVTALRM
আদেশ সহকারে:
with
এবং OrderedDict
।আমি @ জান্ডারের সুন্দর উত্তরটিতে ফিরে আসছি যখন এর মতো মুখোমুখি হ'ল অনুলিপি-অনুলিপিের অনুলিপিটির প্রত্যাশায়:
user@machine:~$ grep Sig...: /proc/18475/status
SigPnd: 0000000000000000
SigBlk: fffffffe7dfbfaff
SigIgn: 0000000000001000
SigCgt: 0000000182006e47
user@machine:~$
অনুমান করুন আমাকে কিছুটা কড়াতে হবে ... বলুন:
user@machine:~$ ruby -wn - /proc/18475/status <<'EOF'
if $_.match(/Sig(Pnd|Blk|Ign|Cgt):\s([0-9a-f]{16})/) == nil
next
end
field = $1
mask = $2.to_i(16)
names = []
Signal.list().each_pair() {
|name, number|
if number == 0
# "EXIT" => 0
next
end
if (mask & (1 << (number - 1))) == 0
next
end
names << name
}
puts("Sig#{field}: #{names.join(" | ")}")
EOF
SigPnd:
SigBlk: HUP | INT | QUIT | ILL | TRAP | IOT | ABRT | FPE | BUS | SYS | PIPE | ALRM | TERM | URG | TSTP | CONT | CHLD | CLD | TTIN | TTOU | IO | XCPU | XFSZ | PROF | WINCH | USR1 | USR2 | PWR | POLL
SigIgn: PIPE
SigCgt: HUP | INT | QUIT | BUS | SEGV | ALRM | TERM | VTALRM | USR1 | USR2
user@machine:~$
আমি চেয়েছিলাম এটি কিছুটা সুগঠিত হোক, তবে এটি আমার পছন্দের চেয়ে প্রার্থনা করা কিছুটা ক্ল্যামিয়ার করে তুলেছে, সুতরাং @ অ্যালাঙ্কের পরামর্শের জন্য ধন্যবাদ, আমি এটিকে ~ / bin / psig হিসাবে সংরক্ষণ করব।
ব্যবহার এই(লিঙ্কটি ভাঙ্গা) এই
লাইব্রেরিতে চাকরি সম্পর্কে ইনফস পেতে, যা চলছে।
struct Job
সংকেতগুলির জন্য একটি বিশেষ ক্ষেত্র রয়েছে , বলা হয়sigCgt
আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:
#include"read_proc.h"
int main(void)
{
struct Root * rt=read_proc();
struct Job * jb=rt->first->job;
printf("%ull\n",jb->sigCgt);
return 0;
}
ফ্রিবিএসডি-তে, procstat -i <PID>
কোন সংকেতগুলি প্রক্রিয়া দ্বারা উপেক্ষা করা হবে তা দেখার জন্য ব্যবহার করুন । একইভাবে, procstat -j <PID>
প্রক্রিয়া থ্রেড দ্বারা কোন সংকেতগুলি অবরুদ্ধ রয়েছে তা দেখতে। উভয় কমান্ডই সিগন্যাল মুলতুবি রয়েছে কিনা তা দেখায়।
নমুনা আউটপুট:
$ procstat -i 38540
PID COMM SIG FLAGS
38540 nsulfd HUP -I-
38540 nsulfd INT -I-
38540 nsulfd QUIT -I-
38540 nsulfd ILL ---
38540 nsulfd TRAP ---
...
$ procstat -j 38540
PID TID COMM SIG FLAGS
38540 101220 nsulfd HUP --
38540 101220 nsulfd INT --
38540 101220 nsulfd QUIT -B
38540 101220 nsulfd ILL --
38540 101220 nsulfd TRAP --
...
দেখুন procstat (1) ।
SigBlk
হয় তবে এটিও উপস্থিত হবেSigCgt
? কারণ এটিকে অবরুদ্ধ করে, এর অর্থ হ'ল সামান্য পরে সিগন্যালটি আবার প্রেরণ করা হবে এবং কী ধরা দরকার?