首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Python制作syscall

用Python制作syscall
EN

Stack Overflow用户
提问于 2016-05-04 15:33:27
回答 1查看 20.8K关注 0票数 31

我想用Python制作syscall,函数不是在libc中,有什么方法可以在Python中实现吗?

更确切地说,我想打电话给getdents,它的手册上写着

注意:这些系统调用没有glibc包装器;

我在网上找到的所有现有的相关解决方案都使用ctypeslibc.so:for 示例

请不要问我为什么要直接使用getdents,我有一个非常具体的理由去做,在这个问题中讨论会让人分心。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-04 15:55:45

Libc公开一个函数来调用“自定义”syscalls:long syscall(long number, ...);

syscall()是一个小型库函数,它调用系统调用,其汇编语言接口具有具有指定参数的指定number。例如,当调用C库中没有包装器功能的系统调用时,使用syscall()是很有用的。

只需像任何外部函数一样访问该函数:

代码语言:javascript
运行
复制
import ctypes

libc = ctypes.CDLL(None)
syscall = libc.syscall

例如:

代码语言:javascript
运行
复制
syscall(39)  # 39 = getpid, but you get the gist

或者翻译手册页中的示例:

代码语言:javascript
运行
复制
import os, ctypes

off_t = ctypes.c_long  # YMMV
__NR_getdents = 78  # YMMV

class linux_dirent(ctypes.Structure):
    _fields_ = [
        ('d_ino', ctypes.c_long),
        ('d_off', off_t),
        ('d_reclen', ctypes.c_ushort),
        ('d_name', ctypes.c_char)
    ]

_getdents = ctypes.CDLL(None).syscall
_getdents.restype = ctypes.c_int
_getdents.argtypes = ctypes.c_long, ctypes.c_uint, ctypes.POINTER(ctypes.c_char), ctypes.c_uint

fd = os.open('/tmp/', os.O_RDONLY | os.O_DIRECTORY)

buf = ctypes.ARRAY(ctypes.c_char, 1024)()
while True:
    nread = _getdents(__NR_getdents, fd, buf, len(buf))
    if nread == -1:
        raise OSError('getdents')
    elif nread == 0:
        break

    pos = 0
    while pos < nread:
        d = linux_dirent.from_buffer(buf, pos)

        name = buf[pos + linux_dirent.d_name.offset : pos + d.d_reclen]
        name = name[:name.index('\0')]
        print 'name:', name

        pos += d.d_reclen
票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37032203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档