小编Dan*_*ego的帖子

readdir()是否保证订单?

我正在使用opendir/readdir获取类似linux的系统上的文件列表.看来目录条目按文件名的字母顺序返回.但是,我在手册页中看不到有关此订单的任何内容.

谁能告诉我readdir是否保证订单?

c readdir

50
推荐指数
5
解决办法
3万
查看次数

带有空第二个参数的C条件运算符('?')

通常是'?' 运算符以下列形式使用:

A ? B : C
Run Code Online (Sandbox Code Playgroud)

然而,在B = AI的情况下,已经看到以下缩写

A ? : C
Run Code Online (Sandbox Code Playgroud)

这令人惊讶地起作用.是否更好地保留第二个参数(样式方式),或者某些编译器是否有机会无法处理它?

c conditional operators ternary-operator

39
推荐指数
2
解决办法
1万
查看次数

在sed替换字符串中转义换行符

以下是我尝试在运行时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)

救命!

unix bash solaris escaping sed

22
推荐指数
3
解决办法
2万
查看次数

使用Linux内核中的模块覆盖功能

在没有深入了解原因的细节的情况下,我正在寻找一种干净(尽可能)的方式来替换可加载模块的内核函数和系统调用.我最初的想法是编写一些代码来覆盖一些函数,这些函数将采用原始函数(如果可能的话,可能会调用函数),然后添加一些我自己的代码.关键是我写的函数必须具有原始函数的名称,因此其他代码在尝试访问它时将访问我的函数.

我可以很容易地(相对地)在内核中直接执行此操作,只需将我的代码放入适当的函数中,但我想知道是否有人知道一点C魔法不一定是可怕的内核(或C)编码实践,可以实现同样的结果.

我想到了#define和typedef的想法,但我不能完全破解它.

简而言之:有没有人知道如何有效地覆盖Linux内核中的函数(来自模块)?

编辑:因为它被问到,我本质上想要从内核中记录某些功能(创建/删除目录等),但为了理智,一个可加载的模块似乎有意义,而不是必须编写一个大补丁内核代码并重新编译每个更改.内核添加的代码量很少,但是我希望将大部分工作卸载到模块中.

c linux kernel module

20
推荐指数
1
解决办法
7068
查看次数

如何跳过$ @中的第一个参数?

我的代码:

#!/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)

bash shell

19
推荐指数
2
解决办法
1万
查看次数

使用简单的c ++进行内核模式编程?

我即将钻研核心土地.我的问题与编程语言有关.我已经看到大多数教程都是用C语言编写的.我目前用C++和Assembly编程.我在C++之前也学过C,但是我没有经常使用它.是否可以使用简单的C++在内核模式下编程而无需使用任何高级构造?基本上我试图避免两种语言之间存在的微小差异(比如boolC中没有,没有自动返回0 main,真正的微小差异).我不会使用模板,类等.那么可以使用简单的C++在内核模式下编程而不会有任何重大烦恼吗?

c++ windows kernel wdk

11
推荐指数
1
解决办法
7297
查看次数

Linux - 加入2个CSV文件

我有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中执行此操作的任何想法?

linux csv join

10
推荐指数
2
解决办法
7930
查看次数

显示在gdb中执行的每个汇编指令

我目前有一个棘手的错误发生在我无法访问源或符号的地方,即我可以看到崩溃发生的指令及其地址,但就是这样.我想做的是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.

debugging assembly gdb freebsd

10
推荐指数
2
解决办法
5623
查看次数

共享库构造函数不工作

在我的共享库中,我必须在加载时进行某些初始化.如果我使用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(),则可行.

c linux gcc shared-libraries

10
推荐指数
1
解决办法
9209
查看次数

防止从静态库导入函数

假设我有两个不是由我构建的静态库,我无法控制它们的内容.

库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()".

linux linker gcc ld static-libraries

9
推荐指数
1
解决办法
1658
查看次数