<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Snooda]]></title> 
<link>http://www.snooda.com/index</link> 
<description><![CDATA[Snooda's Blog]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Snooda]]></copyright>
<item>
<link>http://www.snooda.com/read/</link>
<title><![CDATA[python中mailbox类的clear方法实现不大恰当，不过貌似派生类可以调用父类的私有成员]]></title> 
<author>snooda &lt;admin@snooda.com&gt;</author>
<category><![CDATA[默认分类]]></category>
<pubDate>Mon, 27 Sep 2010 09:16:40 +0000</pubDate> 
<guid>http://www.snooda.com/read/</guid> 
<description>
<![CDATA[ 
	    今天准备上线SuperMail，发现后台程序有两个问题，一个问题是相对路径问题，这个好解决，在程序中设置一下工作路径就可以了。还有一个就是权限问题。<br />
<br />
    背景：/var/spool/mail/a   这个是邮箱，权限为660，属于a用户，mail组<br />
          程序的运行者：b，mail组。<br />
<br />
    b用户把a邮箱中的邮件复制到临时文件中后，调用mailbox类的clear方法将a邮箱清空。结果a邮箱的权限变成775，拥有者b，所属组b。猜测clear是把a邮箱删除，重新建立了一下。粗看了下mailbox源码，貌似不是这样的，时间原因，没有细究。（疑点：将/var/spool/mail/的umask设置成0177后a邮箱还是变成775，不知为何）<br />
 <br />
    当sendmail给a邮箱投递信件的时候，发现a邮箱所有者非a，于是chmod所有者为a，并将权限改成600（邮箱权限默认是660的），结果导致b用户无法读取a邮箱。<br />
<br />
    导致这个问题的根本原因是clear方法的实现不当，所以决定重载clear函数，改为使用truncate函数将文件截短为0。遇到另一问题：如何取得a邮箱文件描述符。因为程序逻辑是mbox（mailbox的派生类）将a邮箱加锁，复制内容，清空，解锁。复制内容后，清空前是不能解锁邮箱的。复制内容后是mbox的私有成员_file拥有a邮箱的锁，假如这个时候通过open获得a邮箱的一个描述符，是无法操作a邮箱的（无法获得锁），_file又不能释放锁。所以只能设法获得_file，用来截短文件。查了下，mailbox类中没有方法可以获得私有的_file。尝试在mailbox的派生类中调用self._file.truncate(0),居然成功了。。看来Python中派生类中是可以使用父类的私有成员的。不过这么实现感觉比较山寨。期待更好的方法。
]]>
</description>
</item><item>
<link>http://www.snooda.com/read/#blogcomment</link>
<title><![CDATA[[评论] python中mailbox类的clear方法实现不大恰当，不过貌似派生类可以调用父类的私有成员]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.snooda.com/read/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>