如何从我的C程序中进行系统调用

时间:2015-05-17 18:31:56

标签: c linux-kernel system-calls

如何从C程序进行系统调用。例如,如何调用以下函数?我必须包含哪些标题?

asmlinkage long sys_exit(int error_code);

2 个答案:

答案 0 :(得分:4)

您通常会为系统调用调用C库包装器(例如open()和read()只是包装器)。包装更友好。

作为在装配中自己完成工作的替代方法,您可以尝试glibc中的syscall(2)函数。此函数在没有包装器的情况下进行系统调用,在调用没有包装器函数的系统调用时特别有用。通过这种方式,您只需要为系统调用号提供符号常量,而且我认为比在汇编程序指令中编写系统调用更具可移植性。

doc:

中的示例
#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
int
main(int argc, char *argv[])
{
    pid_t tid;
    tid = syscall(SYS_gettid);
    tid = syscall(SYS_tgkill, getpid(), tid);
}

答案 1 :(得分:1)

asm volatile(
              "xorq %%rdi, %%rdi;"  /* return value */
              "movq $60, %%rax;"    /* syscall id (/asm/unistd_64.h   */
              "syscall;" 
              ::: "rdi", "rax"
            );

您无法从纯C调用它,但您需要像汇编glibc那样从汇编中调用它。 另一种方法是使用int 80h,但这已经过时了。

rdierror_code 0({1}} rax /usr/include/asm/unistd.h #define __NR_exit 60 public class ReportFileHttpHandler : IHttpHandler { public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { // some code } } <system.webServer> <handlers> <add verb="*" path="*.xml" type="ReportFileHttpHandler" name="ReportFileHttpHandler"/> </handlers> public void ProcessRequrest(HttpContext context) 反过来指向32位或64位版本。

child_ids= fields.many2many('co.provincias',
                        'co_provincias_rel',
                        'parent_id',
                        'child_id')