如果套接字绑定到IN6ADDR_ANY或者INADDR_ANY您使用调用,例如recvfrom()在套接字上接收消息.有没有办法找出消息来自哪个接口?
在IPv6链接范围消息的情况下,我希望from参数recvfrom()将scope_id字段初始化为接口Id.不幸的是,它0在我的测试程序中设置.
谁知道找到这些信息的方法?
实际上我正在尝试printf()使用varags在C中编写自己的.但我没有得到正确的解决方案.谁能帮我吗?
在Android上使用OSGi平台时我得到了这个errormsg:

致命信号7(SIGBUS)位于0x595302e0(代码= 2)
我认为我的应用程序在内存中需要那么多空间或者需要很多计算能力.它只是OSGi平台,有20个捆绑包.
我的应用程序总是在那之后重新启动.
有任何想法吗 ?
尝试\i create_db.sqlpsql时会抛出错误:
psql:create_db.sql:123: ERROR: could not load library
"/usr/lib64/pgsql/plpgsql.so": /lib64/libc.so.6: version
`GLIBC_2.14' not found (required by /usr/lib64/pgsql/plpgsql.so)
Run Code Online (Sandbox Code Playgroud)
create_db.sql的第123行是文件的最后一行,位于函数定义的末尾:
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
东西的版本:
$ psql --version
psql (PostgreSQL) 9.2.7
$ /lib64/libc.so.6 --version
GNU C Library (GNU libc) stable release version 2.17, by Roland McGrath et al.
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by …Run Code Online (Sandbox Code Playgroud) 我正在使用 GDB 来调试使用 libpthread 的程序。pthread_create 中发生错误,需要单步执行该函数。不幸的是,当我调试程序时,它没有正确加载共享库符号,因此我无法跳过源代码并有意义地检查程序行为。这是我启动 gdb 后的输出。
Remote debugging using 127.0.0.1:21293
warning: limiting remote suggested packet size (206696 bytes) to 16384
Failed to read a valid object file image from memory.
Run Code Online (Sandbox Code Playgroud)
所以我相信最后一条消息与读取调试符号失败有关。尽管安装了 libc6-dbg 软件包,还是出现这种情况。这是遇到 SIGSEGV 之前的“where”的截断输出(在 pthread_create 中,我想在调试器中检查的函数)
#0 0x68200ce2 in ?? ()
#1 0x68403cbf in ?? ()
#2 0x687571b0 in ?? ()
#3 0x6874c638 in ?? ()
#4 0x68867a72 in ?? ()
....
Run Code Online (Sandbox Code Playgroud)
进程的 /proc/.../maps 显示了 libpthread 映射到内存的位置。
683f8000-68410000 r-xp 00000000 08:01 3017052 /lib/i386-linux-gnu/i686/cmov/libpthread-2.19.so
68410000-68411000 r--p 00017000 08:01 …Run Code Online (Sandbox Code Playgroud) 我们来看看这个Hello World程序
#include <stdio.h>
int main(int argc, char ** argv) {
printf("Hello, World!");
const char* sFile = "/dev/stdout"; // or /proc/self/fd/0
const char* sMode = "w";
FILE * output = fopen(sFile, sMode);
//fflush(stdout) /* forces `correct` order */
putc('!', output); // Use output or stdout from stdio.h
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用output文件描述符编译时,输出为:
!Hello, World!
Run Code Online (Sandbox Code Playgroud)
使用输出stdout提供的文件描述符编译时stdio.h是按预期方式:
Hello, World!!
Run Code Online (Sandbox Code Playgroud)
我想,当putc用后者调用时,它会直接打印到stdout,当使用文件描述符时/dev/stdout,它将打开一个管道并打印到其中.我不确定.
这种行为更有趣,因为它不会覆盖'Hello'的第一个字符,而是将自己推入已经推送的字符串前面的行缓冲区的第一个位置.
从逻辑的角度来看,这是非常意外的.
谁能解释一下究竟发生了什么?
我正在使用
cc …
通常,为了向连接到Linux终端上的标准输入的程序指示EOF,如果我只按Enter键,则需要按Ctrl + D一次,否则按两次.但我注意到patch命令不同.有了它,如果我按下Enter键,我需要按两次Ctrl + D,否则按三次.(cat | patch相反,如果我在输入任何实际输入之前按下Ctrl + D,它就没有这种奇怪之处.)深入研究patch源代码,我追溯到它的方式循环fread.这是一个做同样事情的最小程序:
#include <stdio.h>
int main(void) {
char buf[4096];
size_t charsread;
while((charsread = fread(buf, 1, sizeof(buf), stdin)) != 0) {
printf("Read %zu bytes. EOF: %d. Error: %d.\n", charsread, feof(stdin), ferror(stdin));
}
printf("Read zero bytes. EOF: %d. Error: %d. Exiting.\n", feof(stdin), ferror(stdin));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在完全按原样编译和运行上述程序时,这是事件的时间表:
fread.fread调用read系统调用.read系统调用返回5.freadread再次呼叫系统呼叫.我目前正在使用GCC 4.5.3,为PowerPC 440编译,并且正在编译一些不需要libc的代码.我没有直接调用memcpy(),但编译器似乎在构建期间插入一个.
有一些链接器选项,如-nostdlib,-nostartfiles,-nodefaultlibs但我无法使用它们,因为我没有进行链接阶段.我只是在编译.有这样的事情:
$ powerpc-440-eabi-gcc -O2 -g -c -o output.o input.c
Run Code Online (Sandbox Code Playgroud)
如果我用nm检查output.o,我会看到对memcpy的引用:
$ powerpc-440-eabi-nm output.o | grep memcpy
U memcpy
$
Run Code Online (Sandbox Code Playgroud)
GCC手册页明确了如何使用链接器删除对memcpy和其他libc调用的调用,但我不希望编译器首先插入它们,因为我使用的是完全不同的链接器(不是GNU的ld) ,它不知道libc).
感谢您的任何帮助,您可以提供.
我正在使用 inotify 事件监视文件的更改(碰巧的是,从 Python 调用 libc)。
对于 a 期间的某些文件git clone,我看到了一些奇怪的东西:我看到了一个IN_CREATE事件,并且我通过ls该文件看到了该文件有内容,但是,我从未看到IN_MODIFY或IN_CLOSE_WRITE. 这给我带来了问题,因为我想IN_CLOSE_WRITE对文件做出响应:具体来说,要启动文件内容的上传。
行为异常的文件在.git/objects/pack目录中,它们以.packor结尾.idx。git 创建的其他文件有一个更规则的IN_CREATE-> IN_MODIFY->IN_CLOSE_WRITE链(我不关注IN_OPEN事件)。
这是在 MacOS 上的 docker 内部,但我在远程系统中的 Linux 上的 docker 上看到了相同的证据,所以我怀疑 MacOS 方面不相关。如果正在观看并且git clone在同一个docker 容器中,我就会看到这一点。
我的问题:
为什么这些文件中缺少这些事件?
可以做些什么呢?具体来说,我如何响应写入这些文件的完成?注意:理想情况下,我想在写作“完成”时做出回应,以避免不必要/(错误地)上传“未完成”的写作。
编辑:阅读https://developer.ibm.com/tutorials/l-inotify/看起来我所看到的与
tmp_pack_hBV4Alz,正在创建、修改和关闭;.pack名称;tmp_pack_hBV4Alz名称被删除。我认为我的问题是尝试使用 inotify 作为上传文件的触发器,然后减少到注意到该.pack文件是另一个文件的硬链接,并在这种情况下上传?
我们的移动应用程序已发布在 Google Play 商店中。崩溃和 ANR 报告在 Firebase Crashlytics 中生成。出现如下所示的ANR。
0 libc.so(系统调用+28)
1 libart.so (art::ConditionVariable::WaitHoldingLocks(art::Thread*)+140)
2 libart.so (art::ThreadList::WaitForOtherNonDaemonThreadsToExit(bool)+336)
3 libart.so(艺术::JII::DestroyJavaVM(_JavaVM*)+32)
4 libandroid_runtime.so (android::AndroidRuntime::start(char const*, android::Vectorandroid::String8 const&, bool)+1032)
5 app_process64(主+1368)
6 libc.so (__libc_init+96)
这个ANR是什么意思?
先感谢您。
libc ×10
c ×4
android ×2
glibc ×2
linux ×2
amazon-ec2 ×1
anr ×1
apache-felix ×1
crashlytics ×1
docker ×1
eof ×1
firebase ×1
fread ×1
gcc ×1
gdb ×1
git ×1
inotify ×1
memcpy ×1
networking ×1
osgi ×1
postgresql ×1
psql ×1
sockets ×1