Linux程式设计入门forkpthreadand signals1.docx
- 文档编号:3515903
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:12
- 大小:17.52KB
Linux程式设计入门forkpthreadand signals1.docx
《Linux程式设计入门forkpthreadand signals1.docx》由会员分享,可在线阅读,更多相关《Linux程式设计入门forkpthreadand signals1.docx(12页珍藏版)》请在冰豆网上搜索。
Linux程式设计入门forkpthreadandsignals1
Linux程式设计入门-fork,pthread,andsignals
作者:
未知文章来源:
中国学习联盟点击数:
169更新时间:
2005-6-7
【字体:
小大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】
Linux程式设计入门-fork,pthread,andsignals
在UNIX程式设计中,学会fork及signal的运用,算是相当基本的功夫。
fork()及signal经常运用在daemon守护神这一类常驻程式,另外像
a4c.tty/yact/chdrv这些中文终端机程式也有用到,一般如
Mozilla/Apache/Squid等大程式几乎都一定会用到。
虽然在UNIX下的程式写作,对thread的功能需求并非很大,但thread在现代的
作业系统中,几乎都已经存在了。
pthread是Linux上的thread函数库,如果您
要在Linux下撰写多线程式,例如MP3播放程式,熟悉pthread的用法是必要的。
pthread及signal都可以用一大章来讨论。
在这里,我只谈及最简单及常用的技
巧,当您熟悉这些基本技巧的运用後,再找一些专门深入探讨pthread及signal
程式写作的书籍来研究。
这些进阶的写法,用到的机会较少,将层次分明,学
习速度应该会比较快。
程序分歧fork()
fork()会产生一个与父程序相同的子程序,唯一不同之处在於其process
id(pid)。
如果我们要撰写守护神程式,或是例如网路伺服器,需要多个行程来同时提供
多个连线,可以利用fork()来产生多个相同的行程。
函数宣告
pid_tfork(void);
pid_tvfork(void);
返回值:
-1:
失败。
0:
子程序。
>0:
将子程序的processid传回给父程序。
在Linux下fork()及vfork()是相同的东西。
范例一:
fork.c
在这个范例中,我们示范fork()的标准用法。
#include
#include
#include
voidmain(void)
{
pid_tpid;
printf("hello\n");
pid=fork();
switch(pid){
case-1:
printf("failure!
\n");break;
case0:
printf("Iamchild!
\n");break;
default:
printf("mychildis%d\n",pid);break;
}
for(;;){/*dosomethinghere*/}
}
编译:
gcc-oex1fork.c
执行结果:
./ex1&
hello
mychildis8650
Iamchild!
我们可以见到,使用fork(),可将一个程式分岐成两个。
在分歧之前的程式码
只执行一次。
检验行程:
ps|grepex1
8649p0R0:
40./ex1
8650p0R0:
40./ex1
8649是父程序的pid,8650则为子程序的pid。
您会需要用到"killallex1"来杀掉两个行程。
范例二:
daemon.c
在UNIX中,我们一般都利用fork(),来实作所谓的"守护神程式",也就是DOS中
所谓的"常驻程式"。
一般的技巧是将父程序结束,而子程序便成为"守护神"。
这个范例中,示范一般标准的daemon写法。
#include
#include
#include
voidmain(void)
{
pid_tpid;
pid=fork();
if(pid>0){
printf("daemononduty!
\n");
exit(0);
}else
if(pid<0){
printf("Can'tfork!
\n");
exit(-1);
}
for(;;){
printf("Iamthedaemon!
\n");
sleep(3);
/*dosomethingyourownhere*/
}
}
编译:
gcc-oex2daemon.c
执行结果:
./ex2
daemononduty!
Iamthedaemon!
接下来每三秒钟,都会出现一个"Iamthedaemon!
"的讯息,这表示您的程式
已经"长驻"在系统中了。
检验行程:
ps|grepex2
8753p0S0:
00./ex2
注意到在范例一中,我们下的指令为"./ex1&",而在范例二中为"./ex2",没
有"&"符号。
范例三:
lock.c
许多的时候,我们希望"守护神"在系统中只有一个,这时候会需要用到pid
lock的技巧。
如果您注意到/var/run目录中的内容,您会发现到有许多的*.pid
档,观看其内容都是一些数字,这些数字其实就是该行程的pid。
#include
#include
#include
voidmain(void)
{
FILE*fp;
pid_tpid;
exit(-1);
}
act.sa_handler=quit;
act.sa_flags=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux程式设计入门forkpthreadand signals1 Linux 程式 设计 入门 forkpthreadand