我可以用来select()确定对 的调用是否recv()会阻塞,但是一旦我确定有要读取的字节,是否有办法在实际调用之前查询当前有多少字节可用recv()?
平台:Linux,OSX
编译器:GCC
我有一个简单的程序,目前让我感到困惑 - 我知道我正在搞乱几种不同类型的数组/指针来产生这个问题 - 它是故意的 - 我试图理解它.
列出的代码将按预期编译和运行,但会data4在调用中strsep(&data4, "e");更改data1或data3导致分段错误.我想了解原因.
#include <stdio.h>
#include <string.h>
int main(int c, char** v) {
char* data1 = "hello\0";
char* data2 = strdup(data1);
size_t sz = strlen(data1);
char data3[sz+1];
char* data4;
memset(data3, 0, sz+1);
data4 = strncpy(data3, data1, sz);
data4[sz] = '\0';
char* found = strsep(&data4, "e");
if (found == NULL) {
printf("nothing found\n");
} else {
printf("found e\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在Unix中是否有类似于IsBadReadPtr的函数?至少IsBadReadPtr的一些功能?我想编写一个程序,如果某个进程发生了不好的事情(如SIGSEGV),它会做出反应并恢复一些信息.但我想检查指针,以确保数据没有损坏,看看它们是否可以安全访问.否则崩溃处理程序本身将崩溃,从而变得无用.
有什么建议?
我想知道为什么这样一个正则表达式的编译占用了我的RAM的70%,导致强烈的交换和16的负载平均值:
strcpy(regexStr,"^[a-z]{0,20000}$" );
regcomp( ®ex , regexStr , REG_NOSUB | REG_EXTENDED );
Run Code Online (Sandbox Code Playgroud)
执行时间大约为几分钟(之前必须终止进程).^[a-z]{0,2000}$(2,000,而不是20,000)的执行大约是100ms,这对我来说很重要.
我用它来检查一个模式,同时检查长度.我发现正则表达式对两者都很方便.难道我做错了什么 ?
我在C中写了一个小程序,我成功打开了一个文件,然后叫睡眠20秒.在那20秒我用shell中的rm删除了打开的文件.睡眠后,程序成功读取数据并将其打印在屏幕上.
int bytes_read;
FILE *fp = fopen("/tmp/file", "r");
sleep(20);
bytes_read = fread(buf, 1, 5, fp);
buf[bytes_read] = '\0';
printf("%s", buf);
Run Code Online (Sandbox Code Playgroud)
我希望它读取0个字节,但它会在文件中打印实际数据.这种行为背后的解释是什么?
这个程序工作,
它逐行读取一个大的日志文件,读完3行后,显示分段错误.
int main(int argc, char *argv[])
{
char *line;
FILE *my_stream;
char *my_filename = "log";
my_stream = fopen (my_filename, "r");
while(fscanf (my_stream, "%s", &line)!= EOF)
{
printf ("==> %s\n", &line);
}
fclose (my_stream);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT
==> 123 ==> 12345 ==> 1234568 Segmentation fault
Run Code Online (Sandbox Code Playgroud) 我正在尝试编译和链接一个程序(我们称之为 myprog),该程序与共享库(在本例中为libcryto 和 libssl,但实际库不相关)链接。我正在Centos 5.5上构建它,但希望在其他类似RHEL的发行版(例如 CloudLinux)上运行相同的二进制文件。两者都具有相同库的版本SO_NAME(即DT_NEEDED版本对应)。
我的问题是这个。当我在 Centos 上编译时,我看到:
centos$ objdump -T myprog | fgrep SSL_new
0000000000000000 DF *UND* 0000000000000000 libssl.so.10 SSL_new
Run Code Online (Sandbox Code Playgroud)
这工作正常,因为:
centos$ objdump -T /usr/lib64/libssl.so.10 | fgrep SSL_new
00000000000447d0 g DF .text 0000000000000390 libssl.so.10 SSL_new
Run Code Online (Sandbox Code Playgroud)
但是,在 CloudLinux 上:
cloudlinux$ objdump -T /usr/lib64/libssl.so.10 | fgrep SSL_new
00000033a623a120 g DF .text 0000000000000390 Base SSL_new
Run Code Online (Sandbox Code Playgroud)
请注意 SSL 符号的版本已从 更改libssl.so.10为Base。
这意味着当我运行二进制文件时,我得到:
cloudlinux$ ./myprog
./myprog: /usr/lib64/libcrypto.so.10: no version information …Run Code Online (Sandbox Code Playgroud) 我知道POSIX定义了应在兼容系统中提供的一组功能。这些措施包括read(),write(),printf(),和其他许多我们所知道的“的libc”功能。
但是POSIX是否为它们强制执行调用约定,还是由OS实现者选择?
STM32芯片(以及许多其他芯片)具有硬件随机数发生器(RNG),它比libc提供的软件RNG更快,更可靠。编译器对硬件一无所知。
rand()?还有其他硬件模块,即实时时钟(RTC),可以为提供数据time()。