Linux多进程程序设计
2015-08-06 15:40
447 查看
用到的函数的功能主要有获取进程id、创建进程、进程退出、进程等待、执行程序。
获取进程id:getpid(),getppid()
创建进程:fork(),vfork()
进程退出:exit()
进程等待:wait()
执行程序:exec(),system()
使用fork函数后,父进程就会产生一个子进程,并且父进程和子进程都会执行fork函数后的代码,直至退出进程。由于在父进程返回子进程PID,在子进程返回0,因此可利用该返回值,让父进程和子进程执行不同功能。子进程打印“this is child program,the return is 0”在shell提示符后面的原因为先执行父进程,执行完父进程后操作系统弹出shell提示符,然后在执行子进程。
先执行子进程,再执行父进程。
fork函数与vfork函数都用于创建子进程,但两者区别有两点:
① fork:子进程拥有独立的数据段,堆栈。
vfork:子进程与父进程共享数据段,堆栈。
② fork:父、子进程的执行次序不确定
vfork:子进程先运行,父进程后运行
父进程可采用return或者exit()函数退出进程;
子进程只能采用exit()函数退出进程,其中exit(0)表示正常退出,exit(1)表示异常退出
执行进程的函数为exec,exec是一个函数族,共有6个:execl,execv,execle,execve,execlp,execvp,以execl为例进行说明
由上可看出,使用execl函数后,原进程代码不再执行,转为执行新的代码。
fork创建一个新的进程,产生一个新的PID。
exec保留原有的进程,执行新的代码。
获取进程id:getpid(),getppid()
创建进程:fork(),vfork()
进程退出:exit()
进程等待:wait()
执行程序:exec(),system()
getpid函数
原型:pid_t getpid(void) 头文件:<unistd.h><sys/types.h> 功能:返回调用该函数的进程id,且该函数总是运行成功
getppid函数
原型:pid_t getppid(void) 头文件:<unistd.h><sys/types.h> 功能:返回调用该函数的进程的父进程id,且该函数总是运行成功
fork函数
原型:pid_t fork(void) 头文件:<unistd.h> 功能:创建一个子进程。成功则在父进程返回子进程PID,在子进程返回0;失败返回-1.
#include<stdio.h> #include<unistd.h> #include<stdlib.h> void main() { pid_t pid; pid=fork(); if(pid==0) { printf("this is child program,the return is %d\n",pid); } else { printf("this is father program,the return is %d\n",pid); } exit(0); }
使用fork函数后,父进程就会产生一个子进程,并且父进程和子进程都会执行fork函数后的代码,直至退出进程。由于在父进程返回子进程PID,在子进程返回0,因此可利用该返回值,让父进程和子进程执行不同功能。子进程打印“this is child program,the return is 0”在shell提示符后面的原因为先执行父进程,执行完父进程后操作系统弹出shell提示符,然后在执行子进程。
vfork函数
原型:pid_t vfork(void) 头文件:<unistd.h><sys/types.h> 功能:创建一个子进程,并阻塞父进程。成功则在父进程返回子进程PID,在子进程返回0;失败返回-1.
#include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<stdlib.h> void main() { pid_t pid; pid=vfork(); if(pid==0) { printf("this is child program,the return is %d\n",pid); } else { printf("this is father program,the return is %d\n",pid); } exit(0); }
先执行子进程,再执行父进程。
fork函数与vfork函数都用于创建子进程,但两者区别有两点:
① fork:子进程拥有独立的数据段,堆栈。
vfork:子进程与父进程共享数据段,堆栈。
② fork:父、子进程的执行次序不确定
vfork:子进程先运行,父进程后运行
父进程可采用return或者exit()函数退出进程;
子进程只能采用exit()函数退出进程,其中exit(0)表示正常退出,exit(1)表示异常退出
wait函数
原型:pid_t wait(int *status) 头文件:<sys/wait.h><sys/types.h> 功能:挂起调用它的进程,直到该进程的一个子进程结束。成功则返回结束的那个子进程的ID,失败返回-1 参数:status若不为NULL,则用于记录子进程的退出状态
执行进程的函数为exec,exec是一个函数族,共有6个:execl,execv,execle,execve,execlp,execvp,以execl为例进行说明
execl函数
原型:int execl(const char* pathname,const char* arg,...) 头文件:<unistd.h> 功能:运行可执行文件,并且原进程的代码不再执行,只执行新的代码。成功时不返回,失败时返回-1. 参数:pathname为要运行的可执行文件的路径 arg及后面的参数作为可执行文件的参数,并以一个NULL作为参数的结束标志。
#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<sys/types.h> #include<sys/wait.h> void main() { pid_t pid; pid=fork(); if(pid==0) { execl("/bin/ls","ls","/home",NULL); printf("this is child program,the return is %d\n",pid); } else { wait(NULL); printf("this is father program,the return is %d\n",pid); } exit(0); }
由上可看出,使用execl函数后,原进程代码不再执行,转为执行新的代码。
fork创建一个新的进程,产生一个新的PID。
exec保留原有的进程,执行新的代码。
system函数
原型:int system(const char* command) 头文件:<stdlib.h> 功能:执行一条shell指令,该函数会产生子进程
相关文章推荐
- centos6.5安装gcc4.9.2
- 关于Linux登录不进去的原因总结(输入正确用户名和密码,屏幕老是回到登录界面)
- [linux] uptime 命令中关于平均负载的解释
- Linux的nohup自动退出
- python监控linux系统信息(流量/内存/cpu/负载/磁盘/运转时间) Centos安装X Window和桌面环境
- linux处置服务Iptables
- sudo: no tty present and no askpass program specified 解决方法
- Linux用户管理实战
- linux 新学到的命令
- Linux时间子系统之二:表示时间的单位和结构
- Linux其他常见压缩备份工具 - dd,cpio
- Linux其他常见压缩备份工具 - dd,cpio
- Install Theano in Linux without root authority (sodu)
- Linux删除文件夹命令
- Linux定时器描述符(timerfd)shiy
- The bug of Lttng
- Linux-iptables 防火墙设置
- Linux完整备份工具 - dump, restore(现在基本不用这两个)
- Linux完整备份工具 - dump, restore(现在基本不用这两个)
- CentOS 下面解决libvirt版本过低、升级冲突问题