这可能有什么问题?我有以下简单的类:
#include "libmnl/libmnl.h"
int main() {
struct mnl_socket *a = mnl_socket_open(12);
}
Run Code Online (Sandbox Code Playgroud)
运行简单的gcccompile(gcc -lmnl main.c)后,我得到以下错误:
/tmp/cch3GjuS.o: In function `main':
main.c:(.text+0xe): undefined reference to `mnl_socket_open'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
在共享库上运行nm表明它实际上已找到:
aatteka@aatteka-Dell1:/tmp$ nm -D /usr/lib/libmnl.so | grep mnl_socket_open
0000000000001810 T mnl_socket_open
Run Code Online (Sandbox Code Playgroud)
这是在Ubuntu 12.04上发生的.该libmnl-dev的和libmnl0包安装.该strace输出gcc表明,ld使用正是*.so文件:
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.so", 0x7fff2a39b470) = -1 ENOENT (No such file or directory)
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.so", O_RDONLY) = -1 ENOENT (No such file or …Run Code Online (Sandbox Code Playgroud) 我正在使用以下C函数从单个流程实例创建多个网络命名空间:
void create_namespace(const char *ns_name)
{
char ns_path[100];
snprintf(ns_path, 100, "%s/%s", "/var/run/netns", ns_name);
close(open(ns_path, O_RDONLY|O_CREAT|O_EXCL, 0));
unshare(CLONE_NEWNET);
mount("/proc/self/ns/net", ns_path, "none", MS_BIND , NULL);
}
Run Code Online (Sandbox Code Playgroud)
在我的进程创建了所有namspaces之后,我在任何一个网络命名空间(带命令)中添加了一个tap接口ip link set tap1 netns ns1,然后我实际上在所有命名空间中看到了这个接口(可能,这实际上是一个名称不同的命名空间).
但是,如果我通过使用多个进程创建多个名称空间,那么一切正常.
这可能有什么问题?我是否必须将任何其他标志传递unshare()给单个流程实例?是否存在单个流程实例无法创建多个网络命名空间的限制?或者是否存在mount()调用问题,因为/proc/self/ns/net实际上已多次挂载?
更新:
似乎unshare()函数正确创建了多个网络命名空间,但/var/run/netns/实际上所有挂载点都引用了该挂载中安装的第一个网络命名空间.
Update2: 似乎最好的方法是fork()另一个进程并从那里执行create_namespace()函数.无论如何,我很高兴听到一个更好的解决方案,不涉及fork()调用或至少得到一个确认,证明不可能从单个进程创建和管理多个网络命名空间.
Update3: 我可以使用以下代码使用unshare()创建多个名称空间:
int main() {
create_namespace("a");
system("ip tuntap add mode tap tapa");
system("ifconfig -a");//shows lo and tapA interface
create_namespace("b");
system("ip tuntap add mode tap tapb");
system("ifconfig …Run Code Online (Sandbox Code Playgroud) 从我自己的自定义操作中抛出ArgumentTypeError异常并让argparse为我捕获它的最佳做法是什么?
似乎argparse的try/except块不能为我的自定义操作处理此异常.虽然它对内置动作很好.
class unique_server_endpoints(argparse.Action):
"""This class avoids having two duplicate OuterIPs in the client argument list"""
def __call__(self, parser, namespace, values, option_string=None):
ips = set()
endpoints = []
for r in values:
ep = server_endpoint(r)
if ep[0] in ips:
raise argparse.ArgumentTypeError("Duplicate OuterIPs found")
else:
ips.add(ep[0])
endpoints.append(ep)
setattr(namespace, self.dest, endpoints)
Run Code Online (Sandbox Code Playgroud)
和
group.add_argument('-c', "--client", nargs = 2,
dest = "servers", action = unique_server_endpoints,
Run Code Online (Sandbox Code Playgroud)
例如,在上面的代码中,如果我有重复的IP,则异常将落入主函数并打印丑陋的堆栈跟踪.我不希望这样,我也不想在main中放置一个try/except块.
我试图trace-cmd收集有关我看到的内核崩溃的更多信息.不幸的是,内核崩溃时出现"内核崩溃 - 不同步"消息(即套接字和文件缓冲区没有刷新,因此崩溃时缓冲区中的任何内容都不可避免地丢失).
有办法:
trace-cmd进程将其缓冲区刷新到文件系统或套接字?要么由于我trace-cmd在虚拟化环境中运行该命令,因此我不关心硬盘驱动器是否偶尔会损坏,因为我可以简单地恢复到最后一个良好的快照或重新部署VM.
lseek(fd,0)然后再read(fd,buf)使用/proc/stat文件而不是重新打开它以便下次获取此文件的更新内容?mmap()打开这个文件后的调用真的如何(见下文)?我遇到的问题是顶级报告CPU使用率太低(软件中断为10%对比100%).strace表示top不会重新打开此文件,而是lseeks开始并再次读取它.不知何故,下次从这个文件读取的内容与我/proc/stat单独运行cat for file 时的内容不匹配.
另外如果我同时/proc/stat在循环中运行top和cat ,那么top会开始报告正确的CPU使用率.
我发现的另一个区别是top mmap()在打开/proc/stat文件后立即使用call ,而cat不是那样做.我不确定这是否也与我的问题有关(因为filesdes=-1这里):
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7b37649000
Run Code Online (Sandbox Code Playgroud)
我正在使用带有2.6.32-27服务器映像的Ubuntu 10.04.1桌面版.CPU是Intel Q6600.
你怎么经常解决这个问题?想象一下,线程在Computer1上的libc代码(这是一个系统共享库)内崩溃,然后生成一个coredump.但是,将分析此coredump的Computer2可能具有不同版本的libc.
所以:
在远程计算机上拥有相同的共享库有多重要?gdb会在Conputer2上没有完全相同版本的libc的情况下正确重建stacktrace吗?
为libc提供正确的调试符号有多重要?gdb会在Computer2上没有完全相同的调试符号的情况下正确地重建堆栈跟踪吗?
什么是避免共享系统库的调试符号不匹配问题的"正确"方法?对我来说,似乎没有单一的解决方案以优雅的方式解决这个问题?也许有人可以分享他的经历?
我把整个问题分成了小问题:
我正在x86_64/Ubuntu 13.04上交叉编译Raspberry Pi项目.调用cmake后:
cmake -DCMAKE_TOOLCHAIN_FILE=./Toolchain-raspberry.pi .
Run Code Online (Sandbox Code Playgroud)
然后make,链接失败:
/opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/../lib/gcc/arm-linux-gnueabihf/4.7.2/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lopencv_gpu
...
Run Code Online (Sandbox Code Playgroud)
问题是cmake生成的Makefile以下列方式调用链接器:
/opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++ CMakeFiles/Watson.dir/main.cpp.o -o Watson -rdynamic -lopencv_gpu -lopencv_contrib -lopencv_legacy -lopencv_objdetect -lopencv_calib3d -lopencv_features2d -lopencv_video -lopencv_highgui -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
Run Code Online (Sandbox Code Playgroud)
它没有指定这些共享库的路径.但是,如果我手动将--sysroot/opt/rpi-rootfs / flag添加到上面的命令,则链接会成功.
在交叉编译时,建议让cmake指定共享库的正确路径的方法是什么?
这是我的Toolchain-raspberry.pi文件:
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_C_COMPILER /opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER /opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++)
SET(CMAKE_FIND_ROOT_PATH "/opt/rpi-rootfs/")
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Run Code Online (Sandbox Code Playgroud)
这是我的CMakeList.txt文件:
cmake_minimum_required(VERSION 2.8)
project(watson)
add_executable(Watson main.cpp)
find_package(OpenCV REQUIRED)
target_link_libraries(Watson ${OpenCV_LIBS})
Run Code Online (Sandbox Code Playgroud)
目标中的/ usr和/ lib目录是rsync到/ opt/rpi-rootfs /并且所有必需的*.so文件都在那里.阅读完cmake文档后,我原本 …
我正在构建一个构建多个共享库和可执行文件的项目.用于构建这些二进制文件的所有源文件都位于单个/ src目录中.因此,弄清楚哪些源文件用于构建每个二进制文件(存在多对多关系)并不明显.
我的目标是编写一个脚本,为每个二进制文件解析一组C文件,并确保只从它们中调用正确的函数.
一种选择似乎是尝试从Makefile中提取此信息.但是这对生成的文件和标题不起作用(由于依赖于Includes).
另一种选择可能是简单地浏览调用图,但这会变得复杂,因为很多函数都是通过使用函数指针来调用的.
还有其他想法吗?
问题:每次事件发生时都有一个C应用程序调用Bash脚本.还有一个C++应用程序需要跟踪这些事件.在C++应用程序是由选择()事件循环驱动.在Bash脚本和C++应用程序之间实现最简单的IPC是什么?
C Application ---Each time calls Bash script---> Bash application ---???---> C++ Application
Run Code Online (Sandbox Code Playgroud)
我想到的几个解决方案:
是否有更简单的东西允许我在select()中只使用一个文件描述符?
我正在开发一个带有python-clang-3.6库的静态分析工具,可以让我绘制函数调用图.
要正确创建,TranslationUnit我需要使用相应的编译命令(即clang.cindex.Index.parse(c_file, compile_command)).但是,我相信,为了能够正确互连,TranslationUnits我还需要使用链接器命令来知道哪些TranslationUnit使用其他功能TranslationUnits.这是我的项目中的一个问题,实际上有多个二进制文件是使用单个"make"调用构建的,有些TranslationUnits可能有冲突的符号名称,所以我不能假设它们都是相互连接的.
解决此问题的最佳方法是什么,以便我的工具知道C文件中的哪些函数可以调用其他C文件中的函数?
现在我看到两个选择:
clang(至少是clang python库); 要么TranslationUnit的AST树时,记住Header文件中函数声明的位置.如果由于宏处理,我会得到不同的行号或者具有不同的隐式函数声明,这个选项看起来很棘手TranslationUnits.还有其他选择吗?哪个选项以及为什么会选择你?