2011-06-01 10 views
5

पर libc से कॉल करना (ctypes के माध्यम से पाइथन में libc से reboot फ़ंक्शन को कॉल करने का प्रयास कर रहा हूं और मैं इसे काम पर नहीं ला सकता हूं। मैं man 2 reboot पृष्ठ (http://linux.die.net/man/2/reboot) का संदर्भ दे रहा हूं। मेरा कर्नेल संस्करण 2.6.35 है।लिथॉन ctypes रीबूट() को लिनक्स

नीचे इंटरैक्टिव पायथन प्रॉम्प्ट से कंसोल लॉग है जहां मैं अपनी मशीन को रीबूट करने की कोशिश कर रहा हूं- मैं क्या गलत कर रहा हूं?

ctypes.get_errno() क्यों काम नहीं कर रहा है?

>>> from ctypes import CDLL, get_errno 
>>> libc = CDLL('libc.so.6') 
>>> libc.reboot(0xfee1dead, 537993216, 0x1234567, 0) 
-1 
>>> get_errno() 
0 
>>> libc.reboot(0xfee1dead, 537993216, 0x1234567) 
-1 
>>> get_errno() 
0 
>>> from ctypes import c_uint32 
>>> libc.reboot(c_uint32(0xfee1dead), c_uint32(672274793), c_uint32(0x1234567), c_uint32(0)) 
-1 
>>> get_errno() 
0 
>>> libc.reboot(c_uint32(0xfee1dead), c_uint32(672274793), c_uint32(0x1234567)) 
-1 
>>> get_errno() 
0 
>>> 

संपादित करें:

वाया Nemos reminder- मैं get_errno प्राप्त कर सकते हैं 22 (अवैध तर्क) वापस जाने के लिए। कोई आश्चर्य नहीं। मुझे reboot() पर कॉल कैसे करना चाहिए? मैं स्पष्ट रूप से कार्य की उम्मीदों को पारित नहीं कर रहा हूं। =)

+0

क्या आप इस स्क्रिप्ट को चलाने के दौरान रूट हैं? –

+0

एक्सेस से इनकार किया गया? मुझे नहीं पता ... इसे पढ़ने की कोशिश करें (पुनः): http://linux.die.net/man/2/reboot – Manux

+1

भले ही पहुंच अस्वीकार कर दी गई हो, फिर भी कोई व्यक्ति 'EPERM' की रिपोर्ट करने के लिए' errno' की अपेक्षा करेगा। – sarnold

उत्तर

3

प्रयास करें:

>>> libc = CDLL('libc.so.6', use_errno=True) 

कि get_errno() काम करने के लिए अनुमति चाहिए।

[अद्यतन]

इसके अलावा, अंतिम तर्क एक void * है। यदि यह 64-बिट सिस्टम है, तो पूर्णांक 0 पूर्ण के लिए मान्य पुनर्वितरण नहीं है। मैं None या शायद c_void_p(None) कोशिश करूँगा। (लेकर सुनिश्चित नहीं हैं कि, हालांकि इस संदर्भ में बात कर सकते हैं।)

[अद्यतन 2]

जाहिर reboot(0x1234567) चाल (टिप्पणी देखें) करता है।

+0

ओह दाएं शुरू करने से पहले रूट हूं- यह घंटी बजती है। धन्यवाद – tMC

+0

'libc.reboot (0xfee1dead, 672274793, 0x1234567, c_void_p (कोई नहीं)) की कोशिश कर रहा है' अभी भी त्रुटि 22 लौटाता है। हालांकि विचार के लिए धन्यवाद। (इसलिए तर्कों के आस-पास 'c_uint() 'का उपयोग करने का प्रयास कर रहा है) – tMC

+0

क्या आपने अभी' रीबूट (0x1234567)' की कोशिश की है? यह हस्ताक्षर है जो मैं sys/reboot.h में देखता हूं ... – Nemo

2

reboot()libc में सिस्कोल के चारों ओर एक रैपर है, जो केवल cmd तर्क लेता है। तो कोशिश:

libc.reboot(0x1234567) 

ध्यान दें कि आप सामान्य रूप से SIGINT भेजकर एक रिबूट की शुरुआत की जानी चाहिए 1 पीआईडी ​​के लिए - रिबूट करने नहीं देंगे किसी भी प्रणाली सफाई से बंद करने के लिए मौका डेमॉन गिरी कह, और यहां तक ​​सिंक नहीं होगा डिस्क पर फाइल सिस्टम कैश।

+0

libc के बारे में अच्छी जानकारी- धन्यवाद। – tMC

संबंधित मुद्दे