我正在使用opendir/readdir获取类似linux的系统上的文件列表.看来目录条目按文件名的字母顺序返回.但是,我在手册页中看不到有关此订单的任何内容.
谁能告诉我readdir是否保证订单?
通常是'?' 运算符以下列形式使用:
A ? B : C
Run Code Online (Sandbox Code Playgroud)
然而,在B = AI的情况下,已经看到以下缩写
A ? : C
Run Code Online (Sandbox Code Playgroud)
这令人惊讶地起作用.是否更好地保留第二个参数(样式方式),或者某些编译器是否有机会无法处理它?
以下是我尝试在运行时b使用换行符替换字符的尝试sedbash
$> echo 'abc' | sed 's/b/\n/'
anc
Run Code Online (Sandbox Code Playgroud)
不,那不是它
$> echo 'abc' | sed 's/b/\\n/'
a\nc
Run Code Online (Sandbox Code Playgroud)
不,那也不是.我想要的输出是
a
c
Run Code Online (Sandbox Code Playgroud)
救命!
在没有深入了解原因的细节的情况下,我正在寻找一种干净(尽可能)的方式来替换可加载模块的内核函数和系统调用.我最初的想法是编写一些代码来覆盖一些函数,这些函数将采用原始函数(如果可能的话,可能会调用函数),然后添加一些我自己的代码.关键是我写的函数必须具有原始函数的名称,因此其他代码在尝试访问它时将访问我的函数.
我可以很容易地(相对地)在内核中直接执行此操作,只需将我的代码放入适当的函数中,但我想知道是否有人知道一点C魔法不一定是可怕的内核(或C)编码实践,可以实现同样的结果.
我想到了#define和typedef的想法,但我不能完全破解它.
简而言之:有没有人知道如何有效地覆盖Linux内核中的函数(来自模块)?
编辑:因为它被问到,我本质上想要从内核中记录某些功能(创建/删除目录等),但为了理智,一个可加载的模块似乎有意义,而不是必须编写一个大补丁内核代码并重新编译每个更改.内核添加的代码量很少,但是我希望将大部分工作卸载到模块中.
我的代码:
#!/bin/bash
for i in $@;
do echo $i;
done;
Run Code Online (Sandbox Code Playgroud)
运行脚本:
# ./script 1 2 3
1
2
3
Run Code Online (Sandbox Code Playgroud)
所以,我想跳过第一个参数并得到:
# ./script 1 2 3
2
3
Run Code Online (Sandbox Code Playgroud) 我即将钻研核心土地.我的问题与编程语言有关.我已经看到大多数教程都是用C语言编写的.我目前用C++和Assembly编程.我在C++之前也学过C,但是我没有经常使用它.是否可以使用简单的C++在内核模式下编程而无需使用任何高级构造?基本上我试图避免两种语言之间存在的微小差异(比如boolC中没有,没有自动返回0 main,真正的微小差异).我不会使用模板,类等.那么可以使用简单的C++在内核模式下编程而不会有任何重大烦恼吗?
我有2个CSV文件:
file_1 columns: id,user_id,message_id,rate
file_2 columns: id,type,timestamp
Run Code Online (Sandbox Code Playgroud)
文件之间的关系是file_1.message_id= files_2.id.
我想创建一个包含以下列的第3个文件:
file_1.id,file_1.user_id,file_1.message_id,file_1.rate,file_2.timestamp
Run Code Online (Sandbox Code Playgroud)
有关如何在Linux中执行此操作的任何想法?
我目前有一个棘手的错误发生在我无法访问源或符号的地方,即我可以看到崩溃发生的指令及其地址,但就是这样.我想做的是gdb运行而不需要交互并显示每条指令,但我还没有找到办法.
我希望实现的是这样的:
(gdb) /* some command */
0x2818a7c0: push %ebp
0x2818a7c1: mov %esp,%ebp
0x2818a7c3: push %ebx
0x2818a7c4: sub $0x4,%esp
...
0x28563622: mov %esi,0x0(%eax)
Program received signal SIGSEGV, Segmentation fault.
Run Code Online (Sandbox Code Playgroud)
我一直在做的是为程序计数器设置一个显示器,如下所示:
(gdb) display/i $pc
Run Code Online (Sandbox Code Playgroud)
然后运行代码stepi:
(gdb) stepi
1: x/i $pc 0x2818a7c0: push %ebp
Run Code Online (Sandbox Code Playgroud)
然而,崩溃是数百或数千条指令,我想要一种方法来看每一个(一起,如果可取的话),而不必多次点击"输入".另外,如果我是手动完成的,我会(gdb)在每条指令之间看到一个提示,这是不太理想的.
我简要介绍的一条路线是脚本,但我唯一的想法是设置main(),显示和另一个中断(下一条指令),然后继续,但后来我不能commands在一个commands块内使用,所以它不会像我想象的那样工作.
如果它很重要,我正在使用FreeBSD.
在我的共享库中,我必须在加载时进行某些初始化.如果我使用GCC属性定义函数__attribute__ ((constructor))它不起作用,即在加载链接我的共享库的程序时不会调用它.
如果我将函数名称更改为_init(),它可以工作.显然现在不推荐使用_init()和_fini()功能.
知道为什么__attribute__ ((constructor)) 不行吗?这是Linux 2.6.9,gcc版本3.4.6
编辑:
例如,假设库代码如下:
#include <stdio.h>
int smlib_count;
void __attribute__ ((constructor)) setup(void) {
smlib_count = 100;
printf("smlib_count starting at %d\n", smlib_count);
}
void smlib_count_incr() {
smlib_count++;
smlib_count++;
}
int smlib_count_get() {
return smlib_count;
}
Run Code Online (Sandbox Code Playgroud)
为了构建.so,我执行以下操作:
gcc -fPIC -c smlib.c
ld -shared -soname libsmlib.so.1 -o libsmlib.so.1.0 -lc smlib.o
ldconfig -v -n .
ln -sf libsmlib.so.1 libsmlib.so
Run Code Online (Sandbox Code Playgroud)
由于.so不在标准位置之一,我更新LD_LIBRARY_PATH并链接.so来自另一个程序.构造函数不会被调用.如果我将其更改为_init(),则可行.
假设我有两个不是由我构建的静态库,我无法控制它们的内容.
库1具有以下功能:
A()
B()
C()
Run Code Online (Sandbox Code Playgroud)
图书馆2有以下功能:
A()
D()
E()
Run Code Online (Sandbox Code Playgroud)
两者都需要链接到调用应用程序,但A()抛出错误的命名冲突.
有没有办法在使用gcc和ld在linux中链接时"忽略库1中的A()".