जवाबों:
फ़ाइल /proc/kallsymsचल रहे कर्नेल के सभी प्रतीकों को सूचीबद्ध करती है। कन्वेंशन द्वारा, सिस्टम कॉल में एक नाम होता है, जो शुरू होता है sys_। 64-बिट सिस्टम पर, 32-बिट प्रोग्राम के लिए सिस्टम कॉल का एक नाम है जो इसके साथ शुरू होता है sys32_। सच पूछिये तो, इस सूचियों आंतरिक गिरी काम करता है, नहीं सिस्टम कॉल, लेकिन मुझे लगता है कि पत्राचार काम करता है लगता है (हर सिस्टम कॉल एक आंतरिक गिरी समारोह का आह्वान काम करने के लिए, और मुझे लगता है कि नाम हमेशा सिस्टम कॉल के नाम के साथ है sys_prepended )।
</proc/kallsyms sed -n 's/.* sys_//p'
यह आमतौर पर उपयोगी जानकारी नहीं है, क्योंकि सिस्टम कॉल बहुत धीरे-धीरे बदलते हैं। वैकल्पिक घटक मौजूदा सिस्टम कॉल के संदर्भ में कार्यक्षमता प्रदान करते हैं, सामान्य सुविधाओं का उपयोग करते हैं जैसे उपकरणों ( ioctl के साथ जब readऔर writeइसे काट नहीं करते हैं), फाइलसिस्टम, सॉकेट्स, आदि समर्थित syscalls की सूची का निर्धारण आपको सुविधाओं के बारे में कुछ भी नहीं बताएगा। यह सिस्टम सपोर्ट करता है। अन्य आंतरिक फ़ंक्शन नाम या तो मदद नहीं करेंगे क्योंकि ये बहुत जल्दी बदल जाते हैं: फ़ंक्शन का नाम जो एक कर्नेल संस्करण पर कुछ सुविधा को लागू करता है अगले संस्करण पर बदल सकता है।
मैं इस उत्तर को लिखते समय नए विकल्प खोजता रहा, इसलिए मैंने उनमें से प्रत्येक के बारे में थोड़ा सा विवरण लिखा और कुछ आँकड़े बनाए। मूल रूप से, आप या तो कर सकते हैं:
/proc)।/sysनिर्देशिका का उपयोग करें ।गणित करने के बाद, मैं /sysफाइल सिस्टम का उपयोग करके (अपने विकल्पों में से) सलाह दूंगा , क्योंकि यह सिस्टम कॉल की संख्या के मामले में सबसे अच्छा परिणाम देता है। यदि आप अन्य ट्रिक्स के बारे में नहीं पढ़ना चाहते हैं तो आप उस सेक्शन पर जा सकते हैं।
जब आप उनमें से कुछ को याद कर सकते हैं, तो आप aproposधारा 2 (सिस्टम कॉल) से संबंधित सभी मैनपेज़ को सूचीबद्ध करने के लिए उपयोग कर सकते हैं :
$ apropos -s2 . | awk '{print $1}' | column
columnयदि आप फैंसी स्तंभित आउटपुट नहीं चाहते हैं तो निकालें ।
मुझे अभी पता चला है, लेकिन सिस्टम कॉल के बारे में लिनक्स मैन पेज है, और आप उनमें से अधिकांश को ढूंढ पाएंगे।
$ man syscalls
मैं इन दो वेब साइटों पर भी आया जो दिलचस्प हो सकती हैं:
संपादित करें: अब, जब यह प्रोग्रामिक रूप से आता है (या कम से कम, दस्तावेज सुविधाओं पर निर्भर हुए बिना) यह निर्धारित करते हुए कि सिस्टम कॉल उपलब्ध हैं, मुझे डर है कि कर्नेल अपने सिस्टम कॉल की तालिका नहीं रखता है, कम से कम के रूप में नहीं तार की एक सूची (जैसा कि आप शायद उन्हें हेरफेर करने की उम्मीद करेंगे)। इस स्तर पर, हम फ़ंक्शन के नामों के बजाय फ़ंक्शंस पते और संकेत के बारे में अधिक बात कर रहे हैं।
मैंने अभी-अभी अपनी /usr/includeनिर्देशिका को तैयार किया है और grepकुछ चीज़ों की खोज की है: आपको निम्नलिखित निर्देशिकाएँ दिलचस्प लग सकती हैं। उनमें से कुछ आपके आर्किटेक्चर और वितरण के आधार पर आपकी मशीन पर भिन्न हो सकते हैं, लेकिन मुझे यकीन है कि आप उन्हें अनुकूलित कर पाएंगे।
इस फ़ाइल में फ़ंक्शन परिभाषाओं की तलाश करके, आप कई सिस्टम कॉल पर आएंगे, भले ही वे पूरी तरह से वहां परिभाषित न हों। मैं grepइन निर्देशिकाओं में कुछ एस चला गया और मैं कुछ सिस्टम कॉल का उल्लेख खोजने में सक्षम था। यहाँ एक उदाहरण है:
$ grep 'sys_exit' /usr/include -R
asm-generic/unistd.h:__SYSCALL(__NR_exit, sys_exit)
इसलिए, मैं उनमें से कुछ को खोजने का एक और तरीका अनुमान लगा रहा हूं:
$ egrep '^__SYSCALL' /usr/include -Rh | awk '{print $2}' | tr -d ')'
एक अन्य उपाय कर्नेल स्रोत कोड का उपयोग करना है (और न केवल हेडर!), और इसे कुशलता से खोजने का एक तरीका है। चूंकि कर्नेल 303395ac3bf3e2cb488435537d416bc840438fcb करता है , इसलिए आपको यह पहले से थोड़ा आसान लग सकता है। यहाँ 3.13 के लिए एक उदाहरण है (जो मेरी कर्नेल है):
$ wget https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/plain/arch/x86/syscalls/syscall_64.tbl?id=refs/tags/v3.13 -O syscall_64.tbl
अब जब आपको वास्तविक syscalls तालिका मिली है, तो इसे ब्राउज़ करें:
$ while read line; do awk '! /#/ {print $3}'; done < syscall_64.tbl
आप एक तरह से मिल सकता है, का उपयोग करते हुए unameऔर archडाउनलोड करने के लिए, tblसे फाइल सीधे git.kernel.org , अपने चल रहे कर्नेल संस्करण और वास्तुकला पर आधारित।
/sysफाइलसिस्टम का उपयोग करनागिल्स के जवाब ने मुझे थोड़ी प्रेरणा दी, और हो सकता है कि आप उन सिस्टम कॉल को अपने अंदर पा सकें /sys/kernel/debug/tracing/events/syscalls। इस निर्देशिका का उपयोग सिस्टम पर प्रत्येक सिस्टम कॉल के उपयोग की निगरानी के लिए किया जाता है। प्रत्येक syscall में दो निर्देशिकाएं हैं:
इसलिए, का उपयोग कर ls, grepऔर cut...
$ ls /sys/kernel/debug/tracing/events/syscalls | grep 'sys_enter' | cut -d'_' -f3
मेरे सिस्टम पर:
grepके लिए आईएनजी __SYSCALLहेडर फाइल में 212 सिस्टम कॉल का पता चला।/sysखुलासा 290 सिस्टम कॉल का उपयोग करना ।अब, अगर मैं सब कुछ एक साथ लाता हूं ...
$ apropos -s2 . | awk '{print $1}' > system_calls.txt
$ egrep '^__SYSCALL' /usr/include -Rh | awk '{print $2}' | tr -d ')' >> system_calls.txt
$ while read line; do awk '! /#/ {print $3}'; done < syscall_64.tbl >> system_calls.txt
$ ls /sys/kernel/debug/tracing/events/syscalls | grep 'sys_enter' | cut -d'_' -f3 >> system_calls.txt
$ sort < system_calls.txt | uniq | wc -l
707
वहां हम जाते हैं, 707 सिस्टम कॉल! बेशक, यह संख्या एक "सिस्टम कॉल" की बहुत लचीली परिभाषा को दर्शाती है, क्योंकि 3.13 केवल 274 सिस्टम कॉल प्रदान करने के लिए माना जाता है (रीडिंग /sysनिकटतम समाधान लगता है)।
सभी उत्तर ठीक हैं।
यदि आप एक विशिष्ट सिस्टम कॉल नाम की तलाश कर रहे हैं:
$ cat /proc/kallsyms | grep <sys_call_name>
यदि आप सभी सिस्टम कॉल की सूची देख रहे हैं:
$ cat /proc/kallsyms
/proc/kallsymsकिसी भी अन्य फ़ाइल की तरह हेरफेर किया जा सकता है , इसलिए प्रोग्राम में इसका उपयोग करना काफी आसान हो जाता है।