Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Linux中构建系统调用。内核>;3.x.x_C_Linux_Gcc_Linux Kernel_Glibc - Fatal编程技术网

C 在Linux中构建系统调用。内核>;3.x.x

C 在Linux中构建系统调用。内核>;3.x.x,c,linux,gcc,linux-kernel,glibc,C,Linux,Gcc,Linux Kernel,Glibc,我最初的尝试是借助此工具构建系统调用 我的发行版信息:Linux-epq2.site 3.7.10-1.16-default\1 SMP周五5月31日20:21:23 UTC 2013(97c14ba)x86\u 64 x86\u 64 GNU/Linux 在我的程序的当前版本中,这将允许我将其嵌入到系统调用中,因为它确实有一个main(愚蠢的说法,但仅仅是为了制造一些东西) (更明确) 在我目前的计划中: 它接收用户的两个输入,进行一些计算,并以图形和一些数据的形式给出输出 我最初的尝试是通过

我最初的尝试是借助此工具构建系统调用

我的发行版信息:
Linux-epq2.site 3.7.10-1.16-default\1 SMP周五5月31日20:21:23 UTC 2013(97c14ba)x86\u 64 x86\u 64 GNU/Linux

在我的程序的当前版本中,这将允许我将其嵌入到系统调用中,因为它确实有一个main(愚蠢的说法,但仅仅是为了制造一些东西) (更明确)

在我目前的计划中:

它接收用户的两个输入,进行一些计算,并以图形和一些数据的形式给出输出

我最初的尝试是通过
unistd
库中的
execlp
调用该程序,如下所示:

#include<linux/linkage.h>
#include<linux/kernel.h>
#include<unistd.h>

asmlinkage long graph(const char* granularity, char* application)
{
        pid_t child;
        child = fork();
        if (!child) {
                execlp("./system-call", granularity, application, NULL);
        }
        sleep(0.2);
        return 0;
}
我检查了是否安装了glibc,我看到所有内核头文件都可用

zypper search glibc      
Loading repository data...
Reading installed packages...

S | Name                     | Summary                                               | Type   
--+--------------------------+-------------------------------------------------------+--------
i | glibc                    | Standard Shared Libraries (from the GNU C Library)    | package
i | glibc-32bit              | Standard Shared Libraries (from the GNU C Library)    | package
i | glibc-devel              | Include Files and Libraries Mandatory for Development | package
i | glibc-devel-32bit        | Include Files and Libraries Mandatory for Development | package
i | glibc-devel-static       | C library static libraries for -static linking        | package
i | glibc-devel-static-32bit | C library static libraries for -static linking        | package
i | glibc-extra              | Extra binaries from GNU C Library                     | package
i | glibc-info               | Info Files for the GNU C Library                      | package
i | glibc-locale             | Locale Data for Localized Programs                    | package
i | glibc-locale-32bit       | Locale Data for Localized Programs                    | package
i | glibc-utils              | Development utilities from GNU C library              | package
i | linux-glibc-devel        | Linux headers for userspace development               | package
我检查了它在新内核转储中是否可用,但它不可用

unistd.h
/usr/include/unistd.h
复制到我要编译的新内核转储是否安全

还是有别的办法

这里有一个更新:编辑

我不得不把它从
#include
改为
#include
但我还是得到了错误

error: implicit declaration of function ‘fork’ [-Werror=implicit-function-declaration]
error: implicit declaration of function ‘execlp’ [-Werror=implicit-function-declaration]
warning: incompatible implicit declaration of built-in function ‘execlp’ [enabled by default]
确实不确定问题出在哪里。

On fork()/exec()错误:不能从内核模式调用库代码。考虑一下您正在尝试做什么,fork生成一个新的用户进程作为当前进程的克隆,exec用一个新进程替换该进程。Fork和exec本身就是系统调用(尽管您通常调用的函数是围绕调用本身的libc包装器),因此尝试通过调用系统调用来创建系统调用有点落后

关于实现graph():您不能从内核模式运行用户空间程序(如“graph”程序),至少不容易。您需要将图形程序的代码编译到内核中的某个地方(这里有一个模块很好,但这比将.c文件放到源代码树中并编译它们要困难得多)


可以直接从内核模式调用fork和exec,但这不是创建graph()系统调用所需的操作。

内核空间不是用户空间。不要期望内核的开发方式与用户空间的开发方式相同。@tangrs:当然,但我看不出有什么错误:-)这是链接文件还是其他问题?使用
#include
同样的错误仍然存在。你想在图形函数中做什么?让我们知道,以便我们能为您提供更多帮助。同时也发布模块代码。这是真的。但是,内核应该有一种生成子进程的方法,对吗?你知道函数调用的确切位置吗?@pistal-如果你想生成一个新线程,请阅读关于kthreads的内容。你可以看看usermode helper API。
error: implicit declaration of function ‘fork’ [-Werror=implicit-function-declaration]
error: implicit declaration of function ‘execlp’ [-Werror=implicit-function-declaration]
warning: incompatible implicit declaration of built-in function ‘execlp’ [enabled by default]