【问题标题】:Passing parameters to system calls将参数传递给系统调用
【发布时间】:2011-08-11 22:02:45
【问题描述】:

我做了一个没有参数的基本 helloWorld 系统调用示例,只是:

int main()
{
   syscall(__NR_helloWorld);
   return 0;
}

但现在我想弄清楚如何将实际参数传递给系统调用(即long)。究竟是什么格式,我试过了:

int main()
{
   long input = 1;
   long result = syscall(__NR_someSysCall, long input, long);
   return 0;
}

它需要一个long 并返回一个long,但编译不正确;正确的语法是什么?

【问题讨论】:

    标签: c linux kernel parameter-passing system-calls


    【解决方案1】:

    删除类型名称。这只是一个函数调用。示例:

    #include <sys/syscall.h>
    #include <unistd.h>
    
    int main( int argc, char* argv[] ) {
        char str[] = "boo\n";
        syscall( __NR_write, STDOUT_FILENO, str, sizeof(str) - 1 );
        return 0;
    }
    

    【讨论】:

    • 1 指的是参数的数量,但是 4 指的是什么?
    • 不,1 一个参数——在这种情况下stdout文件描述符编号,4是缓冲区的长度,如write( FILENO_STDOUT, boo, 4 );
    【解决方案2】:

    syscall 的原型是

       #define _GNU_SOURCE        /* or _BSD_SOURCE or _SVID_SOURCE */
       #include <unistd.h>
       #include <sys/syscall.h>   /* For SYS_xxx definitions */
    
       int syscall(int number, ...);
    

    这表示它接受可变数量(和类型)的参数。这取决于特定的系统调用。 syscall 不是特定系统调用的正常接口。这些可以显式编码,例如write(fd, buf, len)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-25
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 2019-04-22
      • 2012-07-19
      相关资源
      最近更新 更多