存档在 2013年3月25日

Linux Epoll ET模式EPOLLOUT和EPOLLIN触发时刻

2013年3月25日

ET模式称为边缘触发模式,顾名思义,不到边缘情况,是不会触发的。

EPOLLOUT事件:
EPOLLOUT事件只有在连接时触发一次,表示可写,其他时候想要触发,那你要先准备好下面条件:
1.某次write,写满了发送缓冲区,返回错误码为EAGAIN。
2.对端读取了一些数据,又重新可写了,此时会触发EPOLLOUT。
简单地说:EPOLLOUT事件只有在不可写到可写的转变时刻,才会触发一次,所以叫边缘触发,这叫法没错的!

其实,如果你真的想强制触发一次,也是有办法的,直接调用epoll_ctl重新设置一下event就可以了,event跟原来的设置一模一样都行(但必须包含EPOLLOUT),关键是重新设置,就会马上触发一次EPOLLOUT事件。

EPOLLIN事件:
EPOLLIN事件则只有当对端有数据写入时才会触发,所以触发一次后需要不断读取所有数据直到读完EAGAIN为止。否则剩下的数据只有在下次对端有写入时才能一起取出来了。
现在明白为什么说epoll必须要求异步socket了吧?如果同步socket,而且要求读完所有数据,那么最终就会在堵死在阻塞里。

腾讯公司后台服务器经典面试题 (2009年5月)

2013年3月25日

1, 使用Linux epoll模型,水平触发模式(Level-Triggered);当socket可写时,会不停的触发socket可写的事件,如何处理?
2, 从socket读数据时,socket缓存里的数据,可能超过用户缓存的长度,如何处理? 例如,socket缓存有8kB的数据,而你的缓存只有2kB空间。
3, 向socket发送数据时, 可能只发送了用户缓存里的一半,如何处理?例如,需要向socket发送8kB数据,返回值只有2kB发送成功。
4, C++的虚函数是怎么实现的?
5, C++的虚函数有什么作用? » 阅读更多: 腾讯公司后台服务器经典面试题 (2009年5月)

Linux下C/C++使用GKeyFile读取配置文件

2013年3月25日

对于GKeyFile生成的格式文件,同样可以通过此数据结构进行读取文件中的配置信息,生成的配置文件内容为:

[STARTUP]
x=300
y=600
center=true
timestamp=1314432584
random=0.78204092288815774

[PATH]
bin_path=/bin;/sbin;/usr/bin;/usr/local/bin;/home/jcodeer/bin;

这次使用GKeyFile将其中的每一键项读取出来,进行输出。程序代码:

#include <glib.h>

int main(int argc,char** argv){
    GKeyFile* config = g_key_file_new();
    g_key_file_load_from_file(config,"./019.ini",G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS,NULL);
    
    #define STARTUP "STARTUP"
    #define PATH    "PATH"

    gchar* x = g_key_file_get_value(config,STARTUP,"x",NULL);
    g_print("x = %s\n",x);

    gchar* y = g_key_file_get_string(config,STARTUP,"y",NULL);
    g_print("y = %s\n",y);

    gboolean center = g_key_file_get_boolean(config,STARTUP,"center",NULL);
    g_print("center = %d\n",center);

    gint timestamp = g_key_file_get_integer(config,STARTUP,"timestamp",NULL);
    g_print("timestamp = %u\n",timestamp);

    gdouble random = g_key_file_get_double(config,STARTUP,"random",NULL);
    g_print("random = %0.10f\n",random);

    gsize length,i;
    gchar** bin_path = g_key_file_get_string_list(config,PATH,"bin_path",&length,NULL);
 
    g_print("bin_path=");
    for(i = 0; i < length;i++){
        g_print("%s;",bin_path[i]);
    }
    g_print("\n");

    #undef STARTUP
    #undef PATH

    g_key_file_free(config);
    return 0;
}

Linux下C/C++使用GKeyFile生成配置文件

2013年3月25日

还记得Windows使用的配置文件吗?看看boot.ini文件内容

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS=”Windows Server 2003, Standard” /fastdetect /NoExecute=OptOut
C:\wubildr.mbr = “Ubuntu” » 阅读更多: Linux下C/C++使用GKeyFile生成配置文件