• 2012-03-24

    Linux 核心编程 – fsync, write

    Views: 23698 | 1 Comment

    write

    ssize_t write(int fd, const void *buf, size_t count);

    将数据写到文件中. 注意, 如果文件是保存在硬盘中, write() 函数调用返回之后, 并不表示数据已经写入到硬盘中, 这时如果掉电, 数据可能会丢失.

    fsync

    int fsync(int fd);

    程序调用本函数, 通知内核把数据写到硬盘(file)中. 比如, 你开发一个数据库软件, 就需要这样的函数, 否则掉电或者系统崩溃时便会丢失数据.

    如果你的程序不调用 fsync(), Linux 内核也会自动在"合适"的时候将你的数据真正写入到硬盘(类似调用 fsync), 最长的延时默认是 30 秒.

    阻塞

    阻塞是 IO 的精华所在, 不管是文件 IO 还是网络 IO, 只有真正了理解了 IO 阻塞, 才能做出所谓在高并发高性能软件(服务器).

    当 fsync() 和 write() 同一个 fd 时, write() 必然阻塞. 当系统 IO 非常繁忙时, fsync() 可能会阻塞, 即使系统 IO 不繁忙, fsync() 也会因为数据量大而慢.

    注: 许多 Linux 系统函数如 read(), write() 等, 粗看起来很简单, 也很容易用. 正如所有的事情一样, 要做到精致肯定不简单. 当你脱离初级的学习阶段, 要写真正生产环境的软件时, 这些"简单"的函数就大有门道了. 你需要不断的阅读它们的手册, 了解每一个参数, 每一个返回值, 同时还要阅读和试验在各种条件和环境下这些函数的表现, 这样, 才有可能做出真正的软件.

    Posted by ideawu at 2012-03-24 16:14:19 Tags: ,
  • 2011-09-30

    Shell循环

    Views: 13458 | No Comments

    做个笔记:

    SHELL循环:

    1. while
    i=0; while [ $i -lt 10 ]; do echo $i; i=$(($i+1)); done

    2. for
    for ((i=1; i<=10; i++)); do echo $i; done

    3. while
    cat file.txt | while read line; do echo $line; done
    while read line; do echo $line; done < file.txt

    Posted by ideawu at 2011-09-30 12:14:11
  • 2010-11-13

    Linus又骂人stupid

    Views: 41829 | 15 Comments

    最近, 有位用户向 bugzilla.redhat.com 报告他用 Fedora Linux 上网听 MP3 音乐时, 会播放出奇怪的声音. Linux 之父 Linus Torvalds 参与了讨论, 并最终找出原因, 竟然是 glibc 升级了 memcpy() 函数, 导致浏览器的 Abobe Flash Player 插件出现问题.

    这真是太强大了, 竟然能从上网听音乐追查到几乎是软件最底层基础的 memcpy() 函数! 如果你想知道他是如何一步一步找出 BUG 的原因的, 可以自己去看贴. (我个人不得不表示非常佩服他们敏锐的技术嗅觉和科学精神!)

    这个 BUG 的原因是, 某位 glibc 贡献者(看邮件地址应该是 Intel 公司的某华裔工程师)提交了一个速度更快的 memcpy() 函数的实现并被采纳. 但是, 这个速度更快的 memcpy() 并没有像它的前一个版本一样对源内存和目的内存重叠的情况做兼容, 所以导致了 Flash 插件出问题.

    Continue reading »

    Posted by ideawu at 2010-11-13 16:00:08
  • 2010-06-04

    screen 命令使用

    Views: 13929 | No Comments

    创建会话, 并attach:
    $ screen -S abc

    会话列表:
    $ screen -list
    $ screen -ls

    连接/恢复会话:
    $ screen -r abc

    暂时离开会话, 会话仍在后台运行:
    CTRL+a+d

    停止会话(已连接的情况):
    $ exit

    编辑 ~/.bashrc, 以后重新连接, 你都继续前一个会话:
    $ screen -r abc

    但开户多个会话时, 会提示会话恢复失败.

    Posted by ideawu at 2010-06-04 10:42:59
  • 2010-06-01

    SSH ProxyCommand及其思想

    Views: 35574 | No Comments

    OpenSSH 的客户端有一个 ProxyCommand 的选项, 用于 SSH 客户端与服务器之间的隧道通信(tunneling). 所谓的隧道技术, 也称代理技术, 是网络通信技术的一个普遍概念, 就是把一条信道建立于另外一条信道之上.

    SSH 会话基于一个 TCP 连接. 如果我们把连接的两个端口各自的出口(也即入口)进行截获, 就可以用其它的信道来传输. 而且 SSH 仍然认为它用的是和另一端连接一条 TCP 连接.

    Continue reading »

    Posted by ideawu at 2010-06-01 00:47:42
  • 2010-05-13

    请提供Fuck-All选项

    Views: 32364 | 5 Comments

    由于时间宝贵, 我们不可能弄清每一项东西. 所以, 当我们拿到一个新事物时, 我们会把它定义为某一个已经熟悉的事物的替代品, 用旧的方法来操作新的事物. 如果新事物的操作方法和旧事物相似(接口相同), 或者只经过非常符合大众逻辑的演绎(方法添加了默认参数), 那么, 我们就称这个新事物的学习成本很低.

    我开始使用 SVN, 要进行一次版本合并操作. 在操作之前我知道, 肯定会有大量的冲突, 比如至少有 20 个文件有冲突, 而且这些冲突不是由我一个人产生. 所以, 我希望把所有的冲突都列出来, 然后再由各个人手工解决冲突. 所以, 我执行:

    svn merge https://xxx...
    

    Continue reading »

    Posted by ideawu at 2010-05-13 13:27:55 Tags: ,
|<<<2345678910>>>| 6/15 Pages, 87 Results.