我正在尝试使用makefile编译一些源代码.在makefile中有一堆需要运行的命令sudo.
当我从终端编译源时,一切正常,并且在第一次sudo运行命令等待密码时暂停make .输入密码后,进行简历并完成.
但我希望能够在NetBeans中编译源代码.所以,我开始了一个项目,并展示了netbeans在哪里可以找到源代码,但是当我编译项目时,它会给出错误:
sudo: no tty present and no askpass program specified
Run Code Online (Sandbox Code Playgroud)
它第一次命中sudo命令.
我在互联网上查找了这个问题,我发现的所有解决方案都指向一件事:禁用此用户的密码.由于这里的用户是root用户.我不想那样做.
还有其他解决方案吗?
我希望能够在Linux内核中打印线程的堆栈跟踪.
详细信息:我想将代码添加到特定函数(例如swap_writepage()),这些函数将打印调用此函数的线程的完整堆栈跟踪.像这样的东西:
int swap_writepage(struct page *page, struct writeback_control *wbc)
{
/* code goes here to print stack trace */
int ret = 0;
if (try_to_free_swap(page)) {
unlock_page(page);
goto out;
}
if (frontswap_store(page) == 0) {
set_page_writeback(page);
unlock_page(page);
end_page_writeback(page);
goto out;
}
ret = __swap_writepage(page, wbc, end_swap_bio_write);
out:
return ret;
}
Run Code Online (Sandbox Code Playgroud)
我的故事:最近,Linux内核开发人员在改进内核时开始采用面向对象的原则,这是用C语言编写的.由于C不是OO语言,事情开始变得非常丑陋和难以理解,更不用说没有体面了可以分析C代码的IDE.我不想开始在调试器下运行Linux.注意:如果你是一个内核开发新手,并希望在调试器下运行Linux,请不要付出努力...它将证明是徒劳的(踩踏没有意义).
我正在编写一个内核模块,由进程p1调用以覆盖属于目标进程p2的数据页.
首先,在内核模块内部并且在响应p1发出的proc文件系统的写事件时.我使用目标进程的进程id(p2)来搜索后者的任务结构(p2_task).
要搜索我使用的特定页面get_user_pages(),显然在(p2_task->mm)上调用它.然后我调用了kmap()上一个函数返回的页面.一旦我得到指针,我就使用典型的内存函数(memset())来写入该内存.最后叫了kunmap().
但是,一旦进程再次开始运行,我就可以看到我所做的对目标进程p2没有影响.
我不确定我做错了什么.有人可以帮忙吗?
我怀疑在回应来自p2的请求时,某种程度上你无法写入内存属于进程p2.从这里开始,我们处于不同的背景下.
这是真的,如果不是我能检查的其他内容.如果是问题,反正我可以解决这个问题吗?
我知道 LD_PRELOAD 可用于拦截对共享库中函数的调用(如果应用程序不是静态链接的)。但是,我不知道如何使用它向应用程序添加附加功能或后台线程。
例如,我认为伯克利实验室的检查点/重启使用这种方法将后台线程添加到稍后可能会被检查点的应用程序。
那么,现在的问题是,如何在不事先知道从该应用程序调用共享库的哪些函数的情况下,使用 LD_PRELOAD 将线程注入到已编译的应用程序中?
我想知道SIGSTOPLinux内核是如何工作的.怎么处理?以及内核在处理时如何停止运行?
我熟悉内核代码库.所以,如果你可以引用很好的内核函数,事实上这就是我想要的.我不是从用户的角度来寻找高级描述.
我已经窃听了get_signal_to_deliver()with printk()语句(它正在编译).但我希望有人能够以更好的细节解释事情.
我想知道什么是网络套接字的文件描述符以及如何获取它?我相信这是一个数字?
以下是在互联网上找到的朋友功能的示例:
#include <iostream>
using namespace std;
class Rectangle {
int width, height;
public:
Rectangle() {}
Rectangle(const Rectangle &r) {
width = r.width;
height = r.height;
cout << "copy\n";
}
Rectangle (int x, int y) : width(x), height(y) {}
int area() {return width * height;}
friend Rectangle duplicate (const Rectangle&);
};
Rectangle duplicate (const Rectangle& param)
{
Rectangle res;
res.width = param.width*2;
res.height = param.height*2;
return res;
}
int main () {
Rectangle foo;
Rectangle bar (2,3);
foo = duplicate (bar); …Run Code Online (Sandbox Code Playgroud) 如何在块设备驱动程序中禁用此功能?我的意思是:正如下面的文档中提到的,我想将该“标志”的值设置为 2。我在哪里可以做到这一点?最好在块设备驱动程序代码中。
What: /sys/block/<disk>/queue/nomerges
Date: January 2010
Contact:
Description:
Standard I/O elevator operations include attempts to
merge contiguous I/Os. For known random I/O loads these
attempts will always fail and result in extra cycles
being spent in the kernel. This allows one to turn off
this behavior on one of two ways: When set to 1, complex
merge checks are disabled, but the simple one-shot merges
with the previous I/O request are enabled. When set to 2,
all merge tries …Run Code Online (Sandbox Code Playgroud) 由于task_struct为Linux中的每个线程分配了一个,如何找到属于同一进程的线程?
所以,这是一般性的问题.详细说明,我需要编写一个内核函数来遍历属于进程(p)的线程,给定指向它task_struct或pid 的指针,并对它们做一些事情(例如收集一些信息).
我正在审查一些代码.在该代码中有一个事件监听器的构造函数,类似于以下代码:
public class MyClass implements ActionListener {
SomeOtherClass m_oc;
public MyClass(SomeOtherClass oc) {
if (null == oc) {
throw new IllegalArgumentException("oc cannot be null");
}
m_oc = oc;
m_oc.getClass();
}
@Override
public void actionPerformed(ActionEvent e) {
do_stuff();
}
private void do_stuff() {
/* some more code here, but this code never uses m_oc */
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是:为什么谁会编写这个代码调用m_oc.getClass()?
除了构造函数中的该位置之外m_oc,该对象()SomeOtherClass不是代码中的任何位置.
我一直在使用伯克利实验室(即 BLCR)的这个过程检查点项目。我注意到他们一直在引用内核中的一些函数,这些函数没有被导出,也没有在任何头文件中声明。他们的代码由内核模块和一些用户空间实用程序组成。因此,他们不需要应用任何内核补丁。
他们的配置脚本生成了一些头文件,将这些函数声明为外部函数,然后为每个被调用的函数分配一些指针值。我不确定他们如何生成这些指向函数的指针或他们如何使用它们。
我的问题是:有没有办法调用内核函数而不导出该函数并且不在头文件中声明它?
我希望您在Linux中执行命令并获取已启动进程的进程ID,并将其传递给另一个命令。
我$!在bash中尝试了该变量,如果进程像这样直接启动,它将起作用:
ls &
echo $!
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样使用exec:
exec ls &
echo $!
Run Code Online (Sandbox Code Playgroud)
该$!变量将为空白。
我必须使用exec。有什么线索可以解决这个问题吗?
谢谢。
linux ×9
linux-kernel ×6
c ×4
gcc ×2
process ×2
bash ×1
c++ ×1
class ×1
command-line ×1
exec ×1
java ×1
ld-preload ×1
networking ×1
oop ×1
signals ×1
sockets ×1
stack-trace ×1
sudo ×1
tty ×1