【问题标题】:In Linux (POSIX in general), how do I determine if a thread is in a syscall?在 Linux(一般为 POSIX)中,如何确定线程是否在系统调用中?
【发布时间】:2012-11-02 02:32:16
【问题描述】:

我必须通过知道线程的 tid 来知道线程当前是否正在执行系统调用(例如读/写/等)。有没有办法在 Linux 中做到这一点?

【问题讨论】:

    标签: linux multithreading posix system-calls


    【解决方案1】:

    这应该列出线程的状态码

    ps -p<pid> -o stat
    

    两个相关的代码是:

    D    uninterruptible sleep (usually IO)
    S    interruptible sleep (waiting for an event to complete)
    

    编辑: 如果您想以编程方式获得确切的系统调用,您可以按照您的建议使用ptrace 并阅读EAX,您还应该使用PTRACE_SYSCALL 标志让进程在下一个系统调用条目处停止。

    【讨论】:

    • 有没有办法知道确切的系统调用是什么?
    • 不,不是没有检测你的内核。请注意,如果您希望以编程方式而不是通过命令行工具获取该信息,则它会在 /proc//status 中以“State:”开头的行中公开
    • 您还可以查看strace(1) 实用程序。
    • 我想我可以用 ptrace(PTRACE_GETREGS, ...) 让它显示它的 EAX 会阻塞直到系统调用完成吗?我知道它将在 i386 或 x86_64 上运行。
    • 系统调用号在进行系统调用时存储在 EAX 中。
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    相关资源
    最近更新 更多