我知道两者都是Linux内核中的IPSEC堆栈,并且KLIPS较旧,Netkey较新,但除此之外我没有找到其他文档.我想知道它们之间真正的技术差异.这里有谁可以告诉我差异或分享一些文档来源?
任何帮助,将不胜感激.
这是我的功能:
void abc(char *def, unsigned int w, unsigned int x, unsigned int y, unsigned int z)
{
printf("val 1 : %d\n", w);
printf("val 2 : %d\n", x);
printf("val 3 : %d\n", y);
printf("val 4 : %d\n", z);
}
Run Code Online (Sandbox Code Playgroud)
这是我调用此函数的地方:
unsigned int exp[4] = { 1, 2, 3, 4 };
unsigned short count = 0;
abc(anyarray, exp[count++], exp[count++], exp[count++], exp[count++]);
Run Code Online (Sandbox Code Playgroud)
这是我期望的输出:
val1 : 1
val2 : 2
val3 : 3
val4 : 4
Run Code Online (Sandbox Code Playgroud)
但我得到的完全相反:
val1 : 4
val2 : 3
val3 …Run Code Online (Sandbox Code Playgroud) 我将编写一个Lexical,它将成为内核模块的一部分,我将解析一个文件并返回tokens.为此,我可能需要使用fopen,getc,putc,fseek等函数,这些函数显然是用户空间函数.我已经在内核空间中搜索了这些函数的替代方法,我发现了open,filp_open,sys_open等函数,我想这对我来说没问题.但我想知道的是,在内核空间中是否可以使用getc,putc,seek等函数(在文件操作中非常方便)?
我在建立一个考勤系统的工作,我做得很好,但我被困在一个地方.在计算叶子时,如果一个人在星期五休假,然后在星期一再次休假,那么星期六和星期日之间也应该算作叶子.
我已经能够通过以下查询从我的表中仅提取星期五和星期一:
SELECT * FROM `main` WHERE (DAYOFWEEK( DATE ) =2 OR DAYOFWEEK( DATE ) =6 )
AND emp_no =4 AND STATUS ='leave' ORDER BY DATE ASC
Run Code Online (Sandbox Code Playgroud)
但我不知道如何选择周五和下周一只是让我知道人是在休假上周五以及周一.
任何帮助,将不胜感激.
我刚刚开始在 Linux 内核线程上编程。我有一个问题想和大家分享。我的代码是:
void do_big_things(void *data)
{
// do some really big things
}
struct task_struct *t1;
struct task_struct *t2;
void calling_fucntion()
{
for(j =0; j < 100; j++)
{
t1 = kthread_run(do_big_things, &data1, "thread1");
t2 = kthread_run(do_big_things, &data2, "thread2");
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我对这个问题的结论(我可能是错的)是线程t1和t2是由内核创建和运行的,然后程序在循环开始时返回以创建并运行另外两个线程。由于没有条件等待这些线程完成,内核创建了如此多的线程从而导致堆栈溢出。
我只想知道如何让程序等待这两个线程完成,然后返回循环启动另外两个线程。
任何帮助,将不胜感激。
我正在用C编写一个小的API库模块.我将编译这个模块并将它交给我的开发人员,我将在我的模块的头文件中公开一些必需的函数,这样开发人员将使用我的模块知道调用哪个函数用于所需的功能.现在我想询问一件事:我是否可以只在C中公开所需的功能
我有test.c有:
#include "test.h"
void A()
{
if( some condition is true )
B();
else
return;
}
void B()
{
//some code here
}
Run Code Online (Sandbox Code Playgroud)
在test.h中,我只暴露了一个函数,即
void A();
Run Code Online (Sandbox Code Playgroud)
现在B()明显依赖于放入A()的条件,否则它不能运行,因为只有A()在test.h中公开,那么用户不会知道他/她也可以直接调用B().现在我担心的是,如果用户知道(或猜测)我的模块中有一些名为B()的函数可以绕过A()直接调用,那么它可能会影响我的实现.
我知道在这种情况下C++会更好,因为公共和私有方法,我也有一个想法,我可以通过在B()中使用A()的一些标志检查来阻止B()直接调用,但我想知道如果有任何其他方法,以便用户无法调用我的函数(如B()),这些函数未在头文件中公开.
在C:
让我们说函数"Myfuny()"有50行代码,其中也可以调用其他较小的函数.以下哪一个代码更有效?
void myfunction(long *a, long *b);
int i;
for(i=0;i<8;i++)
myfunction(&a, &b);
Run Code Online (Sandbox Code Playgroud)
要么
myfunction(&a, &b);
myfunction(&a, &b);
myfunction(&a, &b);
myfunction(&a, &b);
myfunction(&a, &b);
myfunction(&a, &b);
myfunction(&a, &b);
myfunction(&a, &b);
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.
我从JNI调用了我的原生dll的方法.它工作正常,但在我的本机代码中的一个地方,我调用exit(1),以便本机代码停止工作但发生的是它也导致退出我的Java应用程序.我错过了什么吗?在JNI中是否有任何方法,以便我只能杀死本机代码而不是整个Java应用程序?
编辑:基本上我用本机代码加密文件.当有人从java取消操作时,我希望它停止加密.
任何帮助将不胜感激.
我有C代码(linux(x86_64)),有些像这样:
typedef struct
{
char k[32];
int v;
}ABC;
ABC states[6] = {0};
ABC* get_abc()
{
return &states[5];
}
Run Code Online (Sandbox Code Playgroud)
在main()中:
int main()
{
ABC *p = get_abc();
.
.
.
printf("%d\n", p->v);
}
Run Code Online (Sandbox Code Playgroud)
我在访问p-> v时在printf语句中遇到分段错误.我试图从gdb调试它,它说"无法访问内存".这里有一件重要的事情是,当我编译这段代码时,gcc会在ABC*p = get_abc()上向我发出警告; 我试图从整数转换指针.我的问题是我从get_abc()返回结构地址然后为什么编译器给我这样的警告?为什么编译器认为它是整数?我认为由于此警告我正在获得分段错误,因为整数不能保存x86_64中的内存地址.
任何帮助,将不胜感激.
我想编写最能使用我系统缓存的代码.例如,我有一个经常在操作中使用的大型数组(2kb大小).为了获得更好的执行速度,我希望将其加载到chache内存中,以便处理器获取它所需的时间更少.如何用C语言确保这个东西?任何帮助,将不胜感激.
我试图从/ dev/random收集真正的随机数.这是我的简单代码:
u_char buf[256];
memset(buf, 0, 256);
int dev = open("/dev/random", O_RDONLY);
int nbr = read(dev, buf, 100);
printf("Number of bytes returned : %d\n", nbr);
Run Code Online (Sandbox Code Playgroud)
你可以看到我要求100个随机字节,但是当我运行这个程序时,我总是得到变量nbr的输出,范围是15到30这是可以理解的,因为/ dev/random并不总是有足够的熵但是我的期望是那个在read()时,/ dev/random应该阻塞,直到它将我的缓冲区填充到100个随机字节,在这种情况下不会发生并且程序不会阻塞.我读了/ dev/random的手册页.它说
当熵池为空时,来自/ dev/random的读取将阻塞,直到收集到额外的环境噪声.
这是否意味着/ dev/random只会在熵池为空时阻塞,并且当它有任何数量的数据时是否会阻塞,无论它是否小于所需的字节数?
任何帮助,将不胜感激.
我正在尝试从 MFT 中删除文件记录,如果我打开原始分区并通过解析 MFT 文件到达所需的文件记录,我就会成功执行此操作。这种方法的问题是,我必须首先锁定卷,以便我可以在任何 MFT 文件记录上写入零,并且如果其他进程持有卷锁定(这是非常有可能的),则由于 Windows 操作系统,写入原始卷会失败限制。
我想到的另一种方法是将“$MFT”作为文件打开,然后对其进行读取和写入。这样我想我就不必锁定音量了。但是,当我尝试通过 createfile winapi 函数打开 $MFT 文件时,即使我以管理员身份运行程序,也会出现“访问被拒绝”错误?
我的问题是如何打开 $MFT 系统文件进行写入和读取?Windows操作系统是否允许系统文件以正常方式读写?如果没有,我还能做什么?
任何帮助,将不胜感激。
以前习惯使用像gdb等工具进行调试,我对它们的实现知之甚少.我试图在我的程序中实现一个反调试技术,但对调试知之甚少,我需要一些帮助.我从http://www.julioauto.com/rants/anti_ptrace.htm看到了以下代码
void anti_ptrace(void)
{
pid_t child;
if(getenv("LD_PRELOAD"))
while(1);
child = fork();
if (child)
wait(NULL);
else
{
pid_t parent = getppid();
if (ptrace(PTRACE_ATTACH, parent, 0, 0) < 0)
while(1);
sleep(1);
ptrace(PTRACE_DETACH, parent, 0, 0);
exit(0);
}
}
Run Code Online (Sandbox Code Playgroud)
我想对你的专家有关于上述代码有多成功以及优缺点的专家意见?
任何帮助,将不胜感激.
c ×9
linux ×4
windows ×2
api ×1
c++ ×1
dayofweek ×1
debugging ×1
dll ×1
entropy ×1
function ×1
gcc ×1
ipsec ×1
java ×1
kernel ×1
linux-kernel ×1
memory ×1
mysql ×1
native ×1
ntfs ×1
optimization ×1
performance ×1
pointers ×1
process ×1
ptrace ×1
random ×1
reverse ×1
select ×1
unix ×1
weekday ×1
weekend ×1
winapi ×1