我参加了一个操作系统课程,第一个分配是添加一些系统调用内核(Redhat,内核版本2.4)。 我添加了一些我认为需要添加的内容,但仍然无效。 我试图运行testing,我发现包装(我已经添加了一个下面的例子和它的sys_call代码)没有链接系统调用。 我知道这是因为我在系统调用中放置了一个printk,并且它们从不出现(而testing本身并没有给出我期待的结果)。 现在从我所了解的添加系统调用的开发过程是: 在说明中创build一个类似示例包装函数的包装器(让我们称之为服务“)。 将sys_aservice写入一个.c文件,该文件将转到linux-2.4.18-14custom文件夹中的许多文件之一。 它的文件取决于我想添加的服务的types(例如,如果它是一个文件系统服务,我把它放在FS)。 在/usr/src/linuxlinux-2.4.18-14custom/arch/i386/kernel/ entry.S表中添加系统调用条目 这是我一开始做的,但似乎不够(因为它似乎没有工作)。 我在网上查了一下(和阅读: 如何添加一个系统调用 ),我读了我需要添加/更改以下事情为了链接工作。 在系统调用的unistd.h中添加一行。 它会看起来像 定义__NR_aservice 添加aservice到生成文件。 所以,例如,如果我把aservice.c放在fs文件夹中,我会添加aservice.c到fs中的makefile。 创build一个aservice.h文件,它将会转到linux-2.4.18-14custom / include / linux(其中所有的h文件都会显示出来?)。 这个.h文件将包含一个名为“stub”的东西,它是由unistd.h中的一个macros自动生成的(这个.h文件必须包含),以便用户程序可以使用你的系统调用。 存根的声明如下所示:_syscallN(返回types,函数名称,arg1types,arg1名称…)“其中”N“是参数的数目。 在aservice.c的每个sys_X函数前面加上关键字“asmlinkage”(这需要包含linkage.h)。 所以函数声明如下所示:asmlinkage int sys_aservice(…){..}之后将.h文件包含在.c文件中。 这一切是正确的吗? 因为即使做了以下事情,似乎仍然没有调用系统调用。 这里是一个包装器和系统调用实现的例子: int stop_monitor(int pid){ long __res; __asm__ volatile ( "movl $244, %%eax;" << 244 is the entry in the sys_call table in entry.S […]
我试图创build一个在Red Hat 6.3平台上运行的c ++守护进程,并且无法理解libc daemon()调用, daemon shell命令, startproc , start-stop-daemon和大约六种其他方法谷歌build议创build守护进程。 我已经看到了需要两个forksbuild议,但是只有一个daemon 。 为什么需要第二个叉子? 如果我编写init.d脚本来调用bash daemon ,c代码是否仍然需要调用daemon ? 我实现我的应用程序来调用c daemon()函数,因为它似乎是最简单的解决scheme,但我遇到了我的环境variables似乎被丢弃的问题。 我如何防止这种情况? 我还需要以特定的用户身份运行守护程序,而不是以root身份运行。 创buildC ++守护进程的最简单的方法是保持其环境variables,作为特定用户运行,并在系统启动时启动?
目前我正在使用netbeans编写一个gtkmm3 GUI,并使用Linux dev服务器编译linux二进制文件。 因为我真的希望我的最终程序是跨平台的,所以我build立了一个专门用于编译linux应用程序的开发服务器。 我正在使用这里列出的自定义回购: http : //sourceforge.net/projects/mingw-w64-archlinux但我有麻烦使用pkg-config。 我已经尝试过所有我能想到的组合(pkg-config mingw-w64-gtkmm3,pkg-config gtkmm-3.0,pkg-config mingw-w64-gtkmm-3.0等),但是他们都给我一个错误: Package mingw-w64-gtkmm3 was not found in the pkg-config search path. Perhaps you should add the directory containing `mingw-w64-gtkmm3.pc' to the PKG_CONFIG_PATH environment variable No package 'mingw-w64-gtkmm3' found 我是新做交叉编译,所以帮助表示赞赏。
跟踪点可以跟踪,但跟踪操作不能正常工作。 在gdb的最后一侧显示跟踪点被跟踪。 但“收取$ regs”不能按预期工作。 我的平台是RH6.4。 1.gdbserver端。 gdbserver :10000 ./a.out Process ./a.out created; pid = 10466 Listening on port 10000 Remote debugging from host 127.0.0.1 2. gdb方。 gdb a.out (gdb) target remote :10000 Remote debugging using :10000 Reading symbols from /lib64/ld-linux-x86-64.so.2…(no debugging symbols found)…done. Loaded symbols for /lib64/ld-linux-x86-64.so.2 0x00000033b7000b00 in _start () from /lib64/ld-linux-x86-64.so.2 Created trace […]
我是Linux编程的新手,我想知道,是否有一种方法可以在相同发行版的较早版本的Linux上运行(不重新编译)我的C ++可执行文件? 例如:说我在RHEL 6上编译我的代码,并想在RHEL 4或5上运行我的可执行文件。 在Windows中,当我们这样做时,我们只安装C ++编译器版本的C ++运行时。 示例:如果我使用VS2012来构build一个使用C ++ 11的C ++项目,我只需要在客户端机器上安装C ++ 11的C ++运行库来运行我的应用程序,而不pipe我使用的是哪个版本的Windows(当然从Windows XP开始)
在我最后一个问题中, Ilmari Karonenbuild议我以离散模式求解拉普拉斯方程。 我正在使用一个网格和每个节点上最近的四个邻居来计算未知的高度。 所以解决的系统可以写成matrix: A(matrixn×n)* U(向量n,未知)= b(向量n,已稳定) 昨天晚上,我环顾networking有关C ++的线性代数。 我的select是犰狳 。 但现在“U”和“B”是std::map : std::map<std::pair<float,float>,float> b; std::map<std::pair<float,float>,float> U; . . . if(g/*grid*/->getNode(r,c)->status == TO_COMPUTE){ U.insert(std::make_pair(std::make_pair(r,c),g->getNode(r,c)->y)); /*right*/ if(g->getNode(r+1,c)->status == SETTLED) b.at(std::make_pair(r,c)) += g >getNode(r+1,c)->y; /*left */ if(g->getNode(r-1,c)->status == SETTLED) b.at(std::make_pair(r,c)) += g->getNode(r-1,c)->y; /*down */ if(g->getNode(r,c+1)->status == SETTLED) b.at(std::make_pair(r,c)) += g->getNode(r,c+1)->y; /*up */ if(g->getNode(r,c-1)->status == SETTLED) b.at(std::make_pair(r,c)) […]
做经典的等价的Unicodestring整理平等? 有时。 #include <iostream> #include <cstring> #include <clocale> int main() { std::setlocale(LC_COLLATE, "en_US.UTF-8"); if (std::strcoll("\xc3\xa9", "e\xcc\x81")) std::cout << "FAIL: No Unicode normalization here" << std::endl; else std::cout << "WIN: Unicode normalization is performed" << std::endl; } 这个程序在我的Cygwin化的Windows机器上得到一个WIN,在我能得到的每一个Linux系统上都失败。 这是预期的行为? 有没有生产WIN的Linux系统? 那么Mac OS X呢? FreeBSD的? 我知道我可以规范化,并与第三方库进行规范对等。 我对UTF-8语言环境的标准sorting规则感兴趣。 这个问题受到这个启发。
我的应用程序通过调用poll()以零超时来检查TCP套接字中的传入数据。 99%的时间工作正常,当有套接字上的数据设置POLLIN标志。 然而,有时在套接字上有数据(我在wireshark上看到这个消息),但是poll()返回0(超时)并且不设置POLLIN标志。 当另一条消息到达时,它会在几秒钟之后设置POLLIN标志。 这是正常的行为? poll()在超时之前总是检查传入数据吗? 根据另一个问题的答案 ,Linux的手册页不太清楚。
我是新的在stackoverflow,至less作为一个提问者。 首先我要为我的拼写正确而道歉,因为这不是我的母语,坦白说我已经忘了很久了。 我正在为Debian 6(内核2.6.39.4)编写一个内核模块,它与我所调用的系统进行交互。 他们都很容易,因为我正在学习的目的。 Syscall看起来像是在工作,并向用户输出一个function,允许插入到一个条目列表中,并在这两个函数中进行注册,一个是读取,另一个是写入。 该模块只是一个计数器,其读取和写入function是计数器值和查询当前计数器值的补充。 如果一切正常,写入function将向计数器添加一个,读取function将计数器返回给用户缓冲区。 问题发生在我使用makefile的时候,然后我收到这个消息(西class牙文的所有东西都被直译了) make -C /lib/modules/2.6.39.4.mikernel/build M=/home/dsouser/Escritorio/FuturaEntrega/ModuloUsaKifs modules make[1]: acess to the directory `/usr/src/linux-headers-2.6.39.4.mikernel' Building modules, stage 2. MODPOST 1 modules WARNING: "create_kifs_entry" [/home/dsouser/Escritorio/FuturaEntrega/ModuloUsaKifs/ModuloUsaKifs.ko] undefined! WARNING: "remove_kifs_entry" [/home/dsouser/Escritorio/FuturaEntrega/ModuloUsaKifs/ModuloUsaKifs.ko] undefined! make[1]: get out of the directory `/usr/src/linux-headers-2.6.39.4.mikernel' 而我不知道为什么不支持创build和删除function。 (包括.h和.c,修改了日程安排,添加到系统调用表,内核编译,安装,并用程序testing),我只是certificate了“sys_kifs”系统调用,但不是.h函数。 这是我使用的makefile。 obj-m = ModuloUsaKifs.o all : make -C /lib/modules/$(shell uname -r)/build […]
我正在查看实时调度程序的/kernel/sched/rt.c中update_curr_rt函数的代码。 有人可以解释它是如何工作的? static void update_curr_rt(struct rq *rq) { struct task_struct *curr = rq->curr; struct sched_rt_entity *rt_se = &curr->rt; struct rt_rq *rt_rq = rt_rq_of_se(rt_se); u64 delta_exec; // Time difference (???) if (curr->sched_class != &rt_sched_class) return; // check if sched class is Real-Time sched class delta_exec = rq->clock_task – curr->se.exec_start; if (unlikely((s64)delta_exec <= 0)) return; // ??? […]