1、 Linux程式设计入门-fork,pthread,and signals 作者:未知 文章来源:中国学习联盟 点击数: 169 更新时间:2005-6-7 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 Linux程式设计入门 - fork, pthread, and signals 在UNIX程式设计中,学会fork及signal的运用,算是相当基本的功夫。 fork()及signal经常运用在daemon守护神这一类常驻程式,另外像 a4c.tty/ya
2、ct/chdrv这些中文终端机程式也有用到,一般如 Mozilla/Apache/Squid等大程式几乎都一定会用到。 虽然在UNIX下的程式写作,对thread的功能需求并非很大,但thread在现代的 作业系统中,几乎都已经存在了。pthread是Linux上的thread函数库,如果您 要在Linux下撰写多线程式,例如MP3播放程式,熟悉pthread的用法是必要的。 pthread及signal都可以用一大章来讨论。在这里,我只谈及最简单及常用的技 巧,当您熟悉这些基本技巧的运用後,再找一些专门深入探讨pthread及signa
3、l 程式写作的书籍来研究。这些进阶的写法,用到的机会较少,将层次分明,学 习速度应该会比较快。 程序分歧fork() fork()会产生一个与父程序相同的子程序,唯一不同之处在於其process id(pid)。 如果我们要撰写守护神程式,或是例如网路伺服器,需要多个行程来同时提供 多个连线,可以利用fork()来产生多个相同的行程。 函数宣告 pid_t fork(void); pid_t vfork(void); 返回值: -1 : 失败。 0 : 子程序
4、
>0 : 将子程序的process id传回给父程序。
在Linux下fork()及vfork()是相同的东西。
范例一: fork.c
在这个范例中,我们示范fork()的标准用法。
#include
5、 case -1: printf("failure!\n"); break; case 0: printf("I am child!\n"); break; default: printf("my child is %d\n",pid); break; } for (;;) { /* do something here */ } } 编译: gcc -o ex1 fork.c 执行结果: ./ex1 & hello my child is 8650 I am child!
6、 我们可以见到,使用fork(),可将一个程式分岐成两个。在分歧之前的程式码 只执行一次。 检验行程: ps | grep ex1 8649 p0 R 0:40 ./ex1 8650 p0 R 0:40 ./ex1 8649是父程序的pid,8650则为子程序的pid。 您会需要用到"killall ex1"来杀掉两个行程。 范例二: daemon.c 在UNIX中,我们一般都利用fork(),来实作所谓的"守护神程式",也就是DOS中 所谓的"常驻程式"。一般的技巧是将父程序结束,而子
7、程序便成为"守护神"。
这个范例中,示范一般标准的daemon写法。
#include
8、 exit(-1); } for (;;) { printf("I am the daemon!\n"); sleep(3); /* do something your own here */ } } 编译: gcc -o ex2 daemon.c 执行结果: ./ex2 daemon on duty! I am the daemon! 接下来每三秒钟,都会出现一个"I am the daemon!"的讯息,这表示您的程式 已经"长驻"在系统中
9、了。
检验行程:
ps | grep ex2
8753 p0 S 0:00 ./ex2
注意到在范例一中,我们下的指令为"./ex1 &",而在范例二中为"./ex2",没
有"&"符号。
范例三: lock.c
许多的时候,我们希望"守护神"在系统中只有一个,这时候会需要用到pid
lock的技巧。如果您注意到/var/run目录中的内容,您会发现到有许多的*.pid
档,观看其内容都是一些数字,这些数字其实就是该行程的pid。
#include
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818