随笔 - 9, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……

2009年7月27日

LINUX核心

http://net.pku.edu.cn/~yhf/lyceum/linuxK/tlk.html

posted @ 2009-07-27 17:42 友哥 阅读(81) | 评论 (0)编辑 收藏

2009年7月25日

strlen源码剖析

http://www.cppblog.com/ant/archive/2007/10/12/32886.html
http://www.cppblog.com/ant/archive/2007/10/12/32886.html

posted @ 2009-07-25 15:29 友哥 阅读(175) | 评论 (0)编辑 收藏

2009年7月23日

real user ID, effective user ID,saved set-user-ID

http://hi.baidu.com/051156/blog/item/9813f7460452c6016a63e554.html
http://hi.baidu.com/051156/blog/item/9813f7460452c6016a63e554.html
http://sunlit.javaeye.com/blog/400898

Unix中,每个进程都包含三个ID:real user ID,effective user ID,saved set user ID

real user ID表示的是实际上进程的执行者是谁。
effective user ID主要用于校验该进程在执行时所获得的文件访问权限,也就是说当进程需要访问文件,系统检查权限时实际上检查的该进程的"effective user ID",或者是effective user ID 告诉系统,该进程在对资源访问时,具有等同于哪个用户的权限。
saved set-user-ID 仅在effective user ID发生改变时保存。(这个看了后面的例子就明白了^_^)

一般情况下,real user ID就是进程的effective user ID,但是当要运行的可执行程序设置了"set-user-ID"位之后,进程的effective user ID变成该文件的属主用户id,同时该进程的"saved set-user-ID"变成此时进程的"effective user ID",也就是该可执行程序的属主用户ID,该进程在执行一些与文件访问权限相关的操作时系统检查的是进程的effective user ID.

为什么需要一个"saved set-user-ID"?因为当进程没有超级用户权限的时候,进程在设置"effective user ID"时需要将需要设置的ID和该进程的"real user ID"或者"saved set-user-ID"进行比较.

APUE2中进行的解释是:
1)If the process has superuser privileges, the setuid function sets the real user ID, effective user ID, and saved set-user-ID to uid.

2)If the process does not have superuser privileges, but uid equals either the real user ID or the saved set-user-ID, setuid sets only the effective user ID to uid. The real user ID and the saved set-user-ID are not changed.

3)If neither of these two conditions is true, errno is set to EPERM, and 1 is returned
也就是说:
1)当用户具有超级用户权限的时候,setuid 函数设置的id对三者都起效.
2)否则,仅当该id为real user ID 或者saved set-user-ID时,该id对effective user ID起效.
3)否则,setuid函数调用失败.

也就是说,这个saved set-user-ID更多的作用是在进程切换自己的effective user ID起作用.

需要特别提醒的是:并没有任何的API可以获取到进程的saved set-user-ID,它仅仅是系统在调用setuid函数时进行比较而起作用的.
APUE2中关于此事的原话如下:
Note that we can obtain only the current value of the real user ID and the effective user ID with the functions getuid and geteuid from Section 8.2. We can't obtain the current value of the saved set-user-ID.


举一个例子说明问题,假设这样的一种情况,系统中有两个用户A,B,还有一个由B创建的可执行程序proc,该可执行程序的set-
user-id位已经进行了设置.

当A用户执行程序proc时,
程序的real user ID = A的用户ID,effective user ID = B的用户ID, saved set-user-ID=B的用户ID.

假如在该进程结束了对某些限制只能由用户B访问的文件操作后,程序将effective user ID设置回A,也就是说此时:
程序的real user ID = A的用户ID,effective user ID = A的用户ID, saved set-user-ID=B的用户ID.

这个改动之所以能成功,原因在于上面列举出的情况2):该ID为进程的real user ID.

最后,假设由于种种原因进程需要再次切换effective user ID为B,可是因为不能通过API获取进程的saved set-user-ID(该值为B的用户ID),所以只能通过两种途径获得(可能还有别的途径):
a)在设置effective user ID变回A之前保存effective user ID,它的值为B的用户ID.
b)调用函数getpwnam( "B"),在返回的struct passwd *指针中成员pw_uid存放的就是用户B的ID.
这样,这个调用setuid(B的用户ID)就会成功,原因也在于上面说的情况2):该ID与进程的saved set-user-ID相同.

posted @ 2009-07-23 22:54 友哥 阅读(350) | 评论 (0)编辑 收藏

2009年7月6日

系统学习Linux系列之Linux系统编程

http://blog.csdn.net/yy_msdn/category/391487.aspx

posted @ 2009-07-06 13:41 友哥 阅读(109) | 评论 (0)编辑 收藏

2009年6月27日

福州大学ACM资源

http://ds.fzu.edu.cn/(eqzuqc45qxg0xe45tdp3pn55)/discuss.aspx

http://ds.fzu.edu.cn/(eqzuqc45qxg0xe45tdp3pn55)/default.aspx

posted @ 2009-06-27 15:54 友哥 阅读(189) | 评论 (0)编辑 收藏

正则表达式30分钟入门教程(正则表达式和sscanf)

http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm

http://msdn.microsoft.com/en-us/library/28hw3sce.aspx
http://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regex.aspx
http://www.regular-expressions.info/
http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx
http://www.oreilly.com/catalog/regex2/

在看这篇文章之前建议你先了解一下什么是正则表达式,具体不重复了,google一下能出一大堆,不过这篇文章比较好,贴个url http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm,作者说30分钟能看完的不是地球人,但是我15分钟就看完了还记住了90%以上,好吧我来自火星,玩笑到此结束,下面切入正题。

      本文的命题源自于这样的一个url,protocol://ip:port/chn/mode,比如说,dv://192.168.1.253:65001/1/1。如果我要解析出来各个部分,并把它们保存到各自的变量里面要怎么做?传统的C程序员会说用strtok慢慢取得各个部分,对于要转成int的用atoi,部分C++程序员也许会放弃strtok转用std::string当中的find系列成员函数(find/find_first_of...)。是的,我以前也是这么干的,两种方法都用过,当然也包括MFC里的CString的相关成员函数。现在,一种全新的方法源自于sscanf这个C语言函数。

      无论你用C还是C++,sscanf和scanf这两个函数都不会太陌生,%d %s %f甚至%02d %.2f这些东西你也很熟,看了上面我说的正则表达式,也许你会写出这么一个正则表达式:[a-zA-Z]+://(\d{1,3}\.){3}(\d{1,3}):\d{1,5}/\d{1,}/\d,没错,这个正则表达式的IP部分有点问题,但是为了描述简单,暂时就这么用了。激动人心的时候到了,我要告诉你的是scanf以及sscanf实际上是支持部分正则表达式的,当然即使是到现在我依旧不敢肯定这个部分是否是ANSI的一部分,但是我的VS2005上没有问题,朋友的VS2003上也没有问题,至于VC6实在太古老暂时找不到测试。但是顺便说一句,VS2005上你用sscanf或者scanf他会出警告的,他说这两个函数不安全建议你用sscanf_s和scanf_s,我试了下推荐的两个函数又不支持这个功能了,比较囧了。

      好了,具体说说sscanf的这个扩展功能吧(暂且这么叫)。sscanf提供的这个扩展功能其实并不能真正称为正则表达式,因为他的书写还是离不开%,而且也很局限。但是作为处理我上面说的url已经是绰绰有余了。sscanf的这个扩展功能支持[]表示支付范围,{}表示重复次数,^表示取非,*表示跳过。所以上面这个url的解析可以写成下面这个样子:

char url[] = "dv://192.168.1.253:65001/1/1"

sscanf(url,"%[^://]%*c%*c%*c%[^:]%*c%d%*c%d%*c%d",protocol,ip,port,chn,type);

解释一下

先取得一个最长的字符串,但不包括字串://,于是protocol="dv\0";

然后跳过三个字符(%*c),其实就是跳过://

接着取一个字符串不包括字符串:,于是ip=192.168.1.253,这里简化处理了,IP就当个字符串来弄,而且不做检查

然后跳过冒号取端口到port,再跳过/取通道号到chn,再跳过/取码流类型到type。

      是不是觉得还不过瘾?我也觉得,接着举例。

sscanf("Phil\nChang","%[^\n]%*c%s",first_name,last_name);

解释:跳过一个换行符,取first_name和last_name

类似上面的sscanf("phil2360@gmail.com","%[^@]%*c%s",user_name,host);

      基本上,这个东西用的不多,但是有时候很实用,让你的代码会很简洁,但是相比正则表达式,功能又显得简陋很多,怎么用,就看个人而定了,还是那句话,不是很确定这东西是不是ANSI的,所以不考虑移植又觉得很简洁那么用吧,考虑移植那么请三思,至于正则表达式,用regex或者boost库吧,哦,我说的是C++,C#本来就带了的!

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/phil2036/archive/2009/05/27/4221704.aspx

posted @ 2009-06-27 11:21 友哥 阅读(268) | 评论 (0)编辑 收藏

ACM在线答题(Judge Online)网站

北大内部 http://ai.pku.cn/JudgeOnline

北京大学(PKU) http://acm.pku.edu.cn/JudgeOnline/

北京邮电大学(BUPT) http://acm.cs.bupt.cn/onlinejudge/

福建师范大学(FJNU) http://acm.fjnu.edu.cn/

福州大学(FZU) http://acm.fzu.edu.cn/

哈尔滨工业大学(HIT) http://acm.hit.edu.cn/

哈工程大 http://acm.hrbeu.edu.cn/

杭州电子科技大学(HDU) http://acm.hziee.edu.cn/ (http://acm.hdu.edu.cn/)

合肥工大 http://acm.tdzl.net:83/JudgeOnline

湖南大学(HNU) http://acm.hnu.cn:8080/online/

华东师范大学(ECNU) http://acm.cs.ecnu.edu.cn/

华中科技大学(HUST) http://acm.hust.edu.cn/JudgeOnline

吉林大学(JLU) http://acm.jlu.edu.cn/joj/

兰州大学 http://acm.sundayclub.cn/JudgeOnline/problemlist

南方航空航天大学 http://acm.nuaa.edu.cn/

南开大学 http://acm.nankai.edu.cn/

宁波大学 http://218.0.7.99:8080/JudgeOnline/

宁波理工(NIT) http://acm.nit.net.cn/

汕头大学(STU) http://acm.stu.edu.cn/

上海大学(SHU) http://acmoj.shu.edu.cn/

上海交通大学 http://acm.sjtu.edu.cn/

四川大学(SCU) http://acm.scu.edu.cn/

天津大学(TJU) http://acm.tju.edu.cn/toj/

同济大学(TJU) http://acm.tongji.edu.cn/

武汉大学 http://acm.whu.edu.cn/oak/

西南科技大学(SWUST)http://acm.swust.edu.cn:8080/JudgeOnline/

厦门大学(XMU) http://acm.xmu.edu.cn/JudgeOnline/

浙江大学(ZJU) http://acm.zju.edu.cn/

浙江工商大学 http://acm.hzic.edu.cn/

浙江工业大学(ZJUT) http://acm.zjut.edu.cn/

浙江师范大学(ZJNU) http://acm.zjnu.cn/

中国地质大学(CUG)http://lab.cug.edu.cn/COJ/

中国科技大学(USTC) http://acm.ustc.edu.cn/

中山大学 http://202.116.77.69/sicily

暨南大学(JNU) http://202.116.24.78/JudgeOnline

湖南省第四界程序设计大赛 http://2008hncpc.usc.edu.cn/

华东师范大学(ECNU):http://acm.cs.ecnu.edu.cn/

浙江师范大学(ZJNU):http://acm.zjnu.cn/

西安交大ACM ICPC 网站 http://acm.eeyes.net/

高效信息学在线判题系统(一个中学生做的) http://www.vijos.cn/

国外的:

西班牙

Valladolid大学 瓦拉杜利德大学

http://online-judge.uva.es/problemset/

http://acm.uva.es/

俄罗斯Ural立大学 http://acm.timus.ru/

UsacoGate http://ace.delos.com/usacogate

萨拉托夫大学 Saratov State University http://acm.sgu.ru/

EL Judge(MIPT): http://acm.mipt.ru/judge/problems.pl

波兰

SPOJ:http://www.spoj.pl/

吉尔吉斯斯坦

KRSU: http://www.olymp.krsu.edu.kg/GeneralProblemset.aspx

巴别诺瓦 http://babelnova.net/node/317

posted @ 2009-06-27 11:19 友哥 阅读(1325) | 评论 (0)编辑 收藏

linux目录名和常见后缀的渊源

Unix已经有35年历史了。许多人认为它开始于中世纪,这个中世纪是相对于计算机技术的产生和发展来说的。在过去的时间里,Unix和它的子分支Linux收集有许多的历史和一些完全古老的语言。在这篇技巧文章中,我们将介绍一少部分古老的语言和它们的目的和作用,以及它们真正的来源。  
   
    RC  
   
    在Linux中,最为常用的缩略语也许是“rc”,它是“runcomm”的缩写――即名词“run   command”(运行命令)的简写。今天,“rc”是任何脚本类文件的后缀,这些脚本通常在程序的启动阶段被调用,通常是Linux系统启动时。如   /etc/rs是Linux启动的主脚本,而.bashrc是当Linux的bash   shell启动后所运行的脚本。.bashrc的前缀“.”是一个命名标准,它被设计用来在用户文件中隐藏那些用户指定的特殊文件;“ls”命令默认情况下不会列出此类文件,“rm”默认情况下也不会删除它们。许多程序在启动时,都需要“rc”后缀的初始文件或配置文件,这对于Unix的文件系统视图来说,没有什么神秘的。  
   
    ETC  
   
    在“etc/bin”中的“etc”真正代表的是“etcetera”(附加物)。在早期的Unix系统中,最为重要的目录是“bin”目录   (“bin”是“binaries”二进制文件――编译后的程序的缩写),“etc”中则包含琐碎的程序,如启动、关机和管理。运行一个Linux必须的东西的列表是:一个二进制程序,etcetera,etcetera――换句话说,是一个底层的重要项目,通常添加一些次等重要的零碎事物。今天,   “etc”包含了广泛的系统配置文件,这些配置文件几乎包含了系统配置的方方面面,同样非常重要。  
   
    Bin  
   
    今天,许多在Linux上运行的大型子系统,如GNOME或Oracle,所编译成的程序使用它们自己的“bin”目录(或者是   /usr/bin,或者是/usr/local/bin)作为标准的存放地。同样,现在也能够在这些目录看到脚本文件,因为“bin”目录通常添加到用户的PATH路径中,这样他们才能够正常的使用程序。因此运行脚本通常在bin中运行良好。  
   
    TTY  
   
    在Linux中,TTY也许是跟终端有关系的最为混乱的术语。TTY是TeleTYpe的一个老缩写。Teletypes,或者   teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,和古老的电报机区别并不是很大。之后,当计算机只能以批处理方式运行时(当时穿孔卡片阅读器是唯一一种使程序载入运行的方式),电传打字机成为唯一能够被使用的“实时”输入/输出设备。最终,电传打字机被键盘和显示器终端所取代,但在终端或   TTY接插的地方,操作系统仍然需要一个程序来监视串行端口。一个getty“Get   TTY”的处理过程是:一个程序监视物理的TTY/终端接口。对一个虚拟网络沮丧服务器(VNC)来说,一个伪装的TTY(Pseudo-TTY,即家猫的TTY,也叫做“PTY”)是等价的终端。当你运行一个xterm(终端仿真程序)或GNOME终端程序时,PTY对虚拟的用户或者如xterm一样的伪终端来说,就像是一个TTY在运行。“Pseudo”的意思是“duplicating   in   a   fake   way”(用伪造的方法复制),它相比“virtual”或“emulated”更能真实的说明问题。而在现在的计算中,它却处于被放弃的阶段。  
   
    Dev  
   
    从TTY留下的命令有“stty”,是“set   tty”(设置TTY)的缩写,它能够生成一个配置文件/etc/initab(“initialization   table”,初始表),以配置gettys使用哪一个串口。在现代,直接附加在Linux窗口上的唯一终端通常是控制台,由于它是特殊的TTY,因此被命名为“console”。当然,一旦你启动X11,“console”TTY就会消失,再也不能使用串口协议。所有的TTY都被储存在“/dev”目录,它是“[physical]   devices”([物理]设备)的缩写。以前,你必须在电脑后面的串口中接入一个新的终端时,手工修改和配置每一个设备文件。现在,Linux(和   Unix)在安装过程中就在此目录中创建了它所能向导的每一个设备的文件。这就是说,你很少需要自己创建它。  

posted @ 2009-06-27 00:26 友哥 阅读(95) | 评论 (0)编辑 收藏

2007年4月1日

每周一题(2007.4.1)

题目:(可以把解题思路和程序发到我的邮箱HongyouLee@gmail.com,大家一起讨论)
从1到N(100000)中任意拿掉两个数,把剩下的99998个数顺序打乱,并且放入数组A中。要求只扫描一遍数组,把这两个数找出来。可以使用最多不超过5个局部变量,不能用数组变量,并且不能改变原数组的值。

posted @ 2007-04-01 16:31 友哥| 编辑 收藏