EPOLL
以下のために今日は、ETモードが失われ、その日の試運転無脳は、それがここに記録され、中にエラーを見つけることにします。
epoll
connect事件
epollのETモードのみを使用する場合、複数cennect
がトリガーする可能性事件
があるのは1つだけなので、ループaccept
が返され-1
、ループにerror
設定されるWAGAIN
かWEOULDBLOCK
、ループを終了しないまでループする必要があります。それ以外の場合は丢失connect事件
。
epollのLTとET
LT の違い:水平トリガー、効率はETトリガーよりも低くなります(特に、同時実行数が多くフローが大きい場合)。ただし、LTにはコード作成の要件が比較的低く、問題が発生する傾向はありません。LTモードサービス書き込みのパフォーマンスは次のとおりです。取得されていないデータがある限り、カーネルは引き続き通知するので、イベントの損失について心配する必要はありません。
ET:エッジトリガーは非常に効率的であり、同時および大量のトラフィックの場合、LTよりはるかに少ないepollシステムコールがあるため、効率は高くなります。ただし、プログラミングの要件は高く、各要求は慎重に処理する必要があります。そうしないと、損失イベントが発生しやすくなります。
以下は、LTとETの違いを示す例です(両方とも非ブロッキングモードであり、ブロッキングは言われず、効率が低すぎます)
。LTモードでは、受け入れ呼び出しが返された場合、現在の接続をすぐに確立してから、epoll_waitを待機できます。次の通知はselectと同じです。
ただし、ETの場合、accpet呼び出しが戻ると、現在の接続の確立に加えて、epoll_waitは、-1を返し、errno == EAGAINを返すまですぐにaccpetをループし続けることはできません。
- リファレンス:http : //www.voidcn.com/article/p-qhcylfuz-bkv.html
man 7 epoll
while(1)
{
struct sockaddr_in client_address;
socklen_t len = sizeof client_address;
int connfd = accept(listenfd, (struct sockaddr*)&client_address, &len);
if(connfd == -1)
{
if(errno == EAGAIN || errno == EWOULDBLOCK)
{
break;
}
}
else
{
addfd(epollfd, connfd, true);
}
}
2つの機能
sendfile();
copy_file_range();
以上两个函数输入必须是可以映射到内存的文件,输出sendfile()必须是套接字,copy_file_range()没有限制。
GDB
// TODO
デバッグマルチスレッドプログラム
http://logan.tw/posts/2015/11/01/debug-multithreaded-program-with-gdb/
その他の
switch
小さな問題については、ごとにcase
中括弧を使用する必要があります。これまでこの問題を使用したことはほとんどありません。ここで参照できます:https : //stackoverflow.com/questions/5685471/error-jump-to-case-label