Linux下C语言编程基础知识(4)

2018-12-14 22:59

printf(\ printf(\

printf(\ printf(\

printf(\ if(my_info) {

printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ } }

3。进程的创建

创建一个进程的系统调用很简单.我们只要调用fork函数就可以了.

#include pid_t fork();

当一个进程调用了fork以后,系统会创建一个子进程.这个子进程和父进程不同的地方只

有他的进程ID和父进程ID,其他的都是一样.就象符进程克隆(clone)自己一样.当然创建

两个一模一样的进程是没有意义的.为了区分父进程和子进程,我们必须跟踪fork的返回

值. 当fork掉用失败的时候(内存不足或者是用户的最大进程数已到)fork返回-1,否则f

ork的返回值有重要的作用.对于父进程fork返回子进程的ID,而对于fork子进程返回0.我们就是根据这个返回值来区分父子进程的. 父进程为什么要创建子进程呢?前面我们已经

说过了Linux是一个多用户操作系统,在同一时间会有许多的用户在争夺系统的资源.有时

进程为了早一点完成任务就创建子进程来争夺资源. 一旦子进程被创建,父子进程一起从

fork处继续执行,相互竞争系统的资源.有时候我们希望子进程继续执行,而父进程阻塞直

到子进程完成任务.这个时候我们可以调用wait或者waitpid系统调用.

#include #include pid_t wait(int *stat_loc);

pid_t waitpid(pid_t pid,int *stat_loc,int options);

wait系统调用会使父进程阻塞直到一个子进程结束或者是父进程接受到了一个信号.如果

没有父进程没有子进程或者他的子进程已经结束了wait回立即返回.成功时(因一个子进

程结束)wait将返回子进程的ID,否则返回-1,并设置全局变量errno.stat_loc是子进程的

退出状态.子进程调用exit,_exit 或者是return来设置这个值. 为了得到这个值Linux定

义了几个宏来测试这个返回值.

WIFEXITED:判断子进程退出值是非0

WEXITSTATUS:判断子进程的退出值(当子进程退出时非0). WIFSIGNALED:子进程由于有没有获得的信号而退出.

WTERMSIG:子进程没有获得的信号号(在WIFSIGNALED为真时才有意义). waitpid等待指定的子进程直到子进程返回.如果pid为正值则等待指定的进程(pid).如果

为0则等待任何一个组ID和调用者的组ID相同的进程.为-1时等同于wait调用.小于-1时等待任何一个组ID等于pid绝对值的进程. stat_loc和wait的意义一样. options可以决定父进程的状态.可以取两个值 WNOHANG:父进程立即返回当没有子进程存在时.

WUNTACHED:当子进程结束时waitpid返回,但是子进程的退出状态不可得到.

父进程创建子进程后,子进程一般要执行不同的程序.为了调用系统程序,我们可以使用系

统调用exec族调用.exec族调用有着5个函数.

#include

int execl(const char *path,const char *arg,...); int execlp(const char *file,const char *arg,...); int execle(const char *path,const char *arg,...); int execv(const char *path,char *const argv[]); int execvp(const char *file,char *const argv[]):

exec族调用可以执行给定程序.关于exec族调用的详细解说可以参考系统手册(man exec

l). 下面我们来学习一个实例.注意编译的时候要加 -lm以便连接数学函数库.

#include #include #include #include #include #include

void main(void) {

pid_t child; int status;

printf(\ if((child=fork())==-1) {

printf(\ exit(1); }

else if(child==0) { int i;

printf(\ for(i=0;i<1000000;i++) sin(i); i=5;

printf(\ exit(i); }

while(((child=wait(&status))==-1)&(errno==EINTR)); if(child==-1)

printf(\

else if(!status)

printf(\ child);

else if(WIFEXITED(status))

printf(\ child,WEXITSTATUS(status)); else if(WIFSIGNALED(status))

printf(\ child,WTERMSIG(status)); }

strerror函数会返回一个指定的错误号的错误信息的字符串.

4。守护进程的创建

如果你在DOS时代编写过程序,那么你也许知道在DOS下为了编写一个常驻内存的程序

我们要编写多少代码了.相反如果在Linux下编写一个\常驻内存\的程序却是很容易的.我

们只要几行代码就可以做到. 实际上由于Linux是多任务操作系统,我们就是不编写代码

也可以把一个程序放到后台去执行的.我们只要在命令后面加上&符号SHELL就会把我们的

程序放到后台去运行的. 这里我们\开发\一个后台检查邮件的程序.这个程序每个一个指

定的时间回去检查我们的邮箱,如果发现我们有邮件了,会不断的报警(通过机箱上的小喇

叭来发出声音). 后面有这个函数的加强版本加强版本


Linux下C语言编程基础知识(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:浅谈在高中数学教学中引进数学史的意义

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: