如何从C程序进行系统调用。例如,如何调用以下函数?我必须包含哪些标题?
asmlinkage long sys_exit(int error_code);
答案 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
,但这已经过时了。
在rdi
中error_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')