一段时间以来,我一直在谷歌上搜索有关在nix机器上实现异步编程/行为的各种方法,并且(正如我之前所知)已经确认仍然没有TRULY异步模式(并发)使用单线程)Linux适用于Windows(IOCP).
以下是linux提供的几种替代方案:
现在问题来了:)
希望有人能够用很好的解释回答所有问题.任何链接到源,其中epoll和AIO设计模式的实现细节是开辟的也是赞赏.
我有以下功能(仅用于复制问题):
template <typename KeyT>
void func(const KeyT cptr) {
std::cout << typeid(KeyT).name() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我想用字符串文字来调用它,如下所示:
func<char*>("literal");
Run Code Online (Sandbox Code Playgroud)
但是,我最终得到了警告:
warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wc++11-compat-deprecated-writable-strings]
我有一个特定需要使用char*
作为我的主要类型,我期待TAD
要考虑param type
的const char*
全部,因为我不是引用服用.
警告来自两者clang
和g++
编译器.
如何param type
推断这里?
提前致谢.
有没有办法在erlang中打开终端设备文件?
我在Solaris上,我正在尝试以下::
Erlang (BEAM) emulator version 5.6 [source] [64-bit] [async-threads:0] [kernel-poll:false] /xlcabpuser1/xlc/abp/arunmu/Dolphin/ebin Eshell V5.6 (abort with ^G) 1> file:open("/dev/pts/2",[write]). {error,eisdir} 2> file:open("/dev/null",[write]). {ok,} 3>
从上面可以看出,erlang文件驱动程序在打开空文件时没有问题,但是没有打开终端设备文件!
由于文件驱动程序能够打开空文件,因此无法得出结论.
有没有其他方法可以打开终端设备文件?
谢谢
这个问题是我头脑中隐藏的一大疑问,也难以用言语来描述.有时似乎很明显,有时候很难破解.所以问题就像这样::
class Base{ public: int a_number; Base(){} virtual void function1() {} virtual void function2() {} void function3() {} }; class Derived:public Base{ public: Derived():Base() {} void function1() {cout << "Derived from Base" << endl; virtual void function4() {cout << "Only in derived" << endl;} }; int main(){ Derived *der_ptr = new Derived(); Base *b_ptr = der_ptr; // As just address is being passed , b_ptr points to derived object b_ptr -> function4(); // Will Give Compilation ERROR!! b_ptr -> function1(); …
我想使用非常方便的Boost async_read_until来读取消息,直到我得到\r\n\r\n
分隔符.
我喜欢使用这个分隔符,因为它很容易使用telnet进行调试并生成多行命令.我只是通过两条新线发出命令结束的信号.
我打电话async_read_until
是这样的:
void do_read()
{
boost::asio::async_read_until(m_socket,
m_input_buffer,
"\r\n\r\n",
std::bind(&player::handle_read, this, std::placeholders::_1, std::placeholders::_2));
}
Run Code Online (Sandbox Code Playgroud)
我的处理程序现在看起来像这样:
void handle_read(boost::system::error_code ec, std::size_t nr)
{
std::cout << "handle_read: ec=" << ec << ", nr=" << nr << std::endl;
if (ec) {
std::cout << " -> emit on_disconnect\n";
} else {
std::istream iss(&m_input_buffer);
std::string msg;
std::getline(iss, msg);
std::cout << "dump:\n";
std::copy(msg.begin(), msg.end(), std::ostream_iterator<int>(std::cout, ", "));
std::cout << std::endl;
do_read();
}
}
Run Code Online (Sandbox Code Playgroud)
我想像std::getline
示例一样使用,但在我的系统上,这可以保留\r
角色.如您所见,如果我连接到服务器并写入hello
加上两个CRLF,我会得到这个转储服务器端:
handle_read: …
Run Code Online (Sandbox Code Playgroud) 我想知道"top"命令如何计算任何进程使用的cpu百分比.
我试过在/ proc目录中读取"psinfo"二进制文件,但它没有帮助找到结果.
请提供有关如何完成的任何信息.
提前致谢.
我正在尝试调试一个棘手的核心转储(来自 -O2 优化的二进制文件)。
// Caller Function
void caller(Container* c)
{
std::list < Message*> msgs;
if(!decoder.called(c->buf_, msgs))
{
....
.....
}
// Called Function
bool
Decoder::called(Buffer* buf, list < Message*>& msgs)
{
add_data(buf); // Inlined code to append buf to decoders buf chain
while(m_data_in && m_data_in->length() > 0)
{
.....
}
}
Run Code Online (Sandbox Code Playgroud)
在调用者和被调用者中,第一个参数都被优化了,这意味着它必须在寄存器中的某个地方。
来电拆解:
推 %r15 移动 %rdi,%r15 推 %r14 推 %r13 推 %r12 推 %rbp 推 %rbx 子 $0x68,%rsp 测试 %rsi,%rsi je 0x8ccd62 cmpq $0x0,(%rsi) je 0x8ccd62 lea 0x40(%rsp),%rax lea …
我们有什么方法可以使用ref合格的成员函数std::mem_fn
吗?
以下代码无法编译:
class DeadPool {
public:
void jump() & {
std::cout << "Did not jump\n";
}
void jump() && {
std::cout << "Jumped from helicopter\n";
}
};
int main() {
DeadPool dp1;
//auto cobj = std::mem_fn(&DeadPool::jump); // Won't compile
//cobj(dp1);
//cobj(DeadPool());
using Func = void (DeadPool::*) () &; // lvalue ref qualifier explicitly provided
Func fp = &DeadPool::jump; // This works, as expected
(std::move(dp1).*fp)();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误信息:
mem_fn_ex.cc:18:15:错误:没有用于调用'mem_fn'的匹配函数
auto cobj = std :: mem_fn(&DeadPool :: jump); //将无法编译^ …
让我把我的问题简单化如下.我是一个内置erlang的网络路由器软件,但在特定情况下,我观察到内存增长非常高,如VM所示.
我有一个进程从socket接收来自其他进程的二进制数据包.
此过程解析二进制数据包并将二进制数据包传递给gen_server(调用handle_cast)
gen_server再次将一些信息存储在ETS表中,并将数据包发送到对等服务器.
当对等服务器响应时,删除来自ETS的条目,并且gen_server响应回第一个进程
此外,如果第一个进程(发送数据包到gen_server)在等待gen_server响应的5秒后得到timedout,它也会删除gen_server中的ETS条目并退出.现在,当大量事件超时(由于对等服务器不可用)以及我研究了erlang给出的"**binary**"和"**processes_used**"时,我观察到高内存增长:内存命令那就是使用大部分内存.
但是成功处理事件时情况并非如此.
下面是我写的一个简单的 TCP 服务器和匹配客户端的例子,开始练习 boost 的 asio 库,Example TCP Client/Server。
就是这样——仅此而已。Booth 示例在几个线程上运行,大部分使用默认设置,没有可能会丢掉东西的随意放置的睡眠......它们真的很容易理解,除了直接调用以提高目标之外几乎没有别的隔离问题。
问题是,客户端的输出如下:
Mbytes/sec: 51.648908, Gbytes/sec: 0.051649, Mbits/sec: 413.191267, Gbits/sec: 0.413191
笔记:
127.0.0.1
.促使我写这个问题的实际点是这个。所述的iperf工具能够实现33.0比特/秒使用TCP经由本地主机。
$ iperf --client 127.0.0.1
------------------------------------------------------------
Client connecting to 127.0.0.1, TCP port 5001
TCP window size: 2.50 MByte (default)
------------------------------------------------------------
[ 3] local 127.0.0.1 port 41952 connected with 127.0.0.1 port 5001
[ ID] …
Run Code Online (Sandbox Code Playgroud) 任何人都可以清楚我的怀疑..为什么这个程序给出10作为输出.你能解释一下机制吗... for循环也有; 在陈述之前
#include <iostream>
using namespace std;
int main() {
int i ;
for ( i =0 ; i<10 ; i++);
{
cout<<i ;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 因此,这是一个奇怪的案例,我有时会看到却无法找出原因。
我们有一个从常规文件读取的C程序。还有其他写入同一文件的进程。该应用程序基于以下事实:在Linux中,写操作是原子的,最大写操作大小为4096字节。
该文件未使用非阻塞标志打开,因此我的假设是读取将被阻塞。
但有时在启动过程中,我们会在中看到“ 资源暂时不可用 ”错误errno
。读取的!= -1返回的大小,但部分读取的大小。
错误消息如下所示:
2018-08-07T06:40:52.991141Z,无效的邮件大小,log_s.bin,fd 670,资源暂时不可用,读取大小285,预期大小525
我的问题是:
为什么我们要EAGAIN
阻止文件读取?
为什么返回值不是-1?
这仅在启动时的初始时间内发生。此后工作正常。在这种情况下,有哪些极端情况可以使我们陷入困境?
class Timp {
// constructori
Timp() {
this->timp_intre_taste = 0;
this->timp_tasta = 0;
}
Timp(int t1, int t2) {
this->timp_intre_taste = t1;
this->timp_tasta = t2;
}
// getteri and setteri
int getTimpIntreTaste(){
return timp_intre_taste;}
void setTimpIntreTaste(int timpIntreTaste){
timp_intre_taste = timpIntreTaste;}
int getTimpTasta()
{
return timp_tasta;
}
void setTimpTasta(int timpTasta)
{
timp_tasta = timpTasta;
}
protected:
int timp_intre_taste;
int timp_tasta;
};
class Sesiune : public Timp
{
int id_utilizator;
int nr_click_stanga;
int nr_click_dreapta;
public:
Sesiune():Timp(0,0)
{
this->id_utilizator = 0;
this->nr_click_dreapta = …
Run Code Online (Sandbox Code Playgroud) c++ ×10
c ×4
boost-asio ×3
c++11 ×2
erlang ×2
inheritance ×2
aio ×1
assembly ×1
binary ×1
boost ×1
constructor ×1
cstdio ×1
epoll ×1
errno ×1
file ×1
file-io ×1
for-loop ×1
gdb ×1
input ×1
linux ×1
loops ×1
memory-leaks ×1
networking ×1
polymorphism ×1
posix ×1
serial-port ×1
solaris ×1
tcp ×1
templates ×1
unix ×1
vtable ×1
x86-64 ×1