我如何获得一个Linux系统调用的C /输出C ++?(How do I get the outpu

2019-10-21 06:11发布

我添加了一个简单helloworld系统调用我的Linux内核。

sys_helloworld

#include <linux/kernel.h>

asmlinkage long sys_helloworld(void)
{
        printk("Hello world\n");
        return 0;
}

它只是打印出Hello world内核日志。

我叫sys_helloworld系统调用就像这样:

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
   long int a = syscall(314); // 314 is the line number of sys_helloworld in syscall table
   printf("System call sys_helloworld returned %ld\n", a);
   return 0;
}

上述程序成功打印Hello world在内核日志。

我的问题 :

我如何获得的输出sys_hello (它打印Hello world内核日志)在我的计划?

Answer 1:

您应该增加两个参数的系统调用:一个缓冲区写入,和它的大小。 然后你可以使用snprintf()来打印你想要的任何字符串。 你一定要确保使用正确的系统调用定义宏。 因为你将要2个参数,我们需要SYSCALL_DEFINE2在这里:

#include <linux/kernel.h> /* For snprintf() */
#include <sys/syscall.h> /* For SYSCALL_DEFINE* macros */
SYSCALL_DEFINE2(sys_helloworld, char *, buff, size_t, buff_sz)
{
        snprintf(buff, buff_sz, "Hello world\n");
        return 0;
}

为了完整,并根据上下文,你可能要改变返回值的东西,可以让你知道字符串是否被截断或没有。

用户代码可以这样称呼它:

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
   char buf[32];
   long int a = syscall(314, buf, sizeof(buf));
   printf("System call sys_helloworld returned %ld\n", a);
   printf("buf = %s\n", buf);
   return 0;
}

需要注意的是一般都比较好风格使用SYSCALL_DEFINE*宏来定义你的系统调用,而不是手工输入的asmlinkage long .... ,即使是不带参数(你可以使用一个系统调用SYSCALL_DEFINE0 )。 这些宏定义中include/sys/syscall.h ,你应该使用它们。



文章来源: How do I get the output of a Linux System Call in C/C++?