是inet_aton线程安全的?我根据这UNP POSIX并不需要很多的套接字API的线程安全的认识,所以我必须承担他们没有,但一般我怎么知道,如果事情是线程在Perl安全吗?我需要在何种程度上锁定我调用的库函数?我该如何锁定它们?当我尝试类似的东西lock(&inet_aton)时会给我一个错误: Can't modify non-lvalue subroutine call in lock.
是的,我读过:系统库的线程安全性
我正在使用Perl检查各种套接字选项的存在和默认值.
#!/usr/bin/perl -w
use strict;
use Socket;
if (defined(SO_BROADCAST)) {
print("SO_BROADCAST defined\n");
}
if (defined(SO_REUSEPORT)) {
print("SO_REUSEPORT defined\n");
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时输出:
SO_BROADCAST defined
Your vendor has not defined Socket macro SO_REUSEPORT, used at ./checkopts.pl line 9
有没有办法在输出中不生成警告的情况下执行此操作?
在测试期间,我有一个模拟对象设置errno = ETIMEDOUT; 我正在测试的对象看到错误并调用strerror_r来获取错误字符串:
if (ret) {
if (ret == EAI_SYSTEM) {
char err[128];
strerror_r(errno, err, 128);
err_string.assign(err);
} else {
err_string.assign(gai_strerror(ret));
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么strerror_r要回垃圾.我甚至试过打电话
strerror_r(ETIMEDOUT, err, 128)
Run Code Online (Sandbox Code Playgroud)
直接,仍然有垃圾.我肯定错过了什么.看来我得到的函数的gnu版本不是posix版本,但在这种情况下不应该有任何区别.
编辑
我在Ubuntu 8.04上.glibc版本在features.h中看起来像2.7.
我Socket operation on non-socket在调用时遇到了一些网络代码中的错误,connect并花了很多时间试图找出导致它的原因.我终于发现以下代码行导致了问题:
if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol) < 0)) {
Run Code Online (Sandbox Code Playgroud)
看到问题?这是该行应该是什么样子:
if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {
Run Code Online (Sandbox Code Playgroud)
我不明白的是为什么第一行不正确的行不会产生警告.换句话说,不应该是一般形式:
if ( foo = bar() < baz ) do_something();
Run Code Online (Sandbox Code Playgroud)
看起来奇怪的编译器,尤其是运行g++ -Wall -Wextra?
如果不是,它不应该至少表现为cppcheck的"坏样式",我也在编译中运行吗?
我在很多地方都读到过关于发送大量小数据包会导致网络拥塞的建议。我什至在最近编写的多线程 tcp 应用程序中也遇到过这种情况。但是,我不知道我是否了解发生这种情况的确切机制。
我最初的猜测是,如果物理传输介质的 MTU 是固定的,并且您发送一堆小数据包,那么每个数据包可能会占用物理介质上的整个传输帧。
例如,我的理解是,尽管以太网支持可变帧,但大多数设备使用 1500 字节的固定以太网帧。在 100 Mbit 时,一个 1500 字节的帧每 0.12 毫秒在线路上“经过”一次。如果我每 0.12 毫秒传输一个 1 字节的消息(加上 tcp 和 ip 标头),我将用 8333 字节的用户数据有效地使 100Mb 以太网连接饱和。
这是对 tinygrams 如何导致网络拥塞的正确理解吗?
我的所有术语都正确吗?
我有一个类似wget的脚本,它下载一个页面,然后检索该页面上IMG标签中链接的所有文件.
给定原始页面的URL和从该页面中的IMG标记中提取的链接,我需要构建我想要检索的图像文件的URL.目前我使用的是我写的函数:
sub build_url {
my ( $base, $path ) = @_;
# if the path is absolute just prepend the domain to it
if ($path =~ /^\//) {
($base) = $base =~ /^(?:http:\/\/)?(\w+(?:\.\w+)+)/;
return "$base$path";
}
my @base = split '/', $base;
my @path = split '/', $path;
# remove a trailing filename
pop @base if $base =~ /[[:alnum:]]+\/[\w\d]+\.[\w]+$/;
# check for relative paths
my $relcount = $path =~ /(\.\.\/)/g;
while ( $relcount-- ) {
pop @base; …Run Code Online (Sandbox Code Playgroud) 是否可以在ANSI-C中实现container_of宏?我不确定如何在ANSI-C中执行它,因为内核实现依赖于GCC Hacks,例如typeof运算符.
我问,因为我想在ANSI-C中实现类似于内核链接列表的通用容器.我想到的实际容器是一个类似于Boost MultiIndex的序列集.
我需要一位有权威资源的语言律师.
看看下面的测试程序,它在gcc下干净地编译:
#include <stdio.h>
void foo(int *a) {
a[98] = 0xFEADFACE;
}
void bar(int b[]) {
*(b+498) = 0xFEADFACE;
}
int main(int argc, char **argv) {
int a[100], b[500], *a_p;
*(a+99) = 0xDEADBEEF;
*(b+499) = *(a+99);
foo(a);
bar(b);
printf("a[98] == %X\na[99] == %X\n", a[98], a[99]);
printf("b[498] == %X\nb[499] == %X\n", b[498], b[499]);
a_p = a+98;
*a_p = 0xDEADFACE;
printf("a[98] == %X\na[99] == %X\n", a[98], a[99]);
}
Run Code Online (Sandbox Code Playgroud)
它产生我期望的输出:
anon@anon:~/study/test_code$ gcc arrayType.c -o arrayType
anon@anon:~/study/test_code$ ./arrayType
a[98] == FEADFACE
a[99] == DEADBEEF …Run Code Online (Sandbox Code Playgroud) 我正在使用 Boost.Test 进行单元测试,目前正在单独的线程中运行各种模拟服务器,这些线程从每个测试中启动。为了更准确地测试我的代码,模拟服务器实际上应该位于单独的进程中。
我正在考虑按照这些思路做一些事情:
MY_TEST()
if (fork() == 0) {
runMockServer(); // responds to test requests or times out, then returns
exit(0);
}
// Connect to MockServ and Run actual test here
END_TEST()
Run Code Online (Sandbox Code Playgroud)
但我担心这会搞砸测试框架。
这安全吗?有人做过这样的事吗?
如果重要的话,我在 Ubuntu 8.04 上使用 Boost 1.34.1。
在你标记为dup之前,是的,我已经在Java中看到了函数指针,不,它没有真正回答我的问题,主要是因为我对Java很新,所以我真的不明白所有的答案.
这是一些混乱的Java/C++,有没有合理的方法在Java中做到这一点?
public class Foo {
private int _data;
/* various other functions */
public boolean test1( Foo other ) { /* do test */ }
public boolean test2( Foo other ) { /* do test */ }
public boolean test3( Foo other ) { /* do test */ }
public boolean test4( Foo other ) { /* do test */ }
}
public class Bar {
private Foo[] _foos = { /* Init an array …Run Code Online (Sandbox Code Playgroud)