Appearance
2.5 Unix SVR4进程管理
一、Unix进程控制相关命令
fork()
:创建一个新进程
exec()
:执行一个可执行程序
exit()
:终止
sleep()
:暂停一段时间
pause()
:暂停并等待信号
wait()
:等待子进程暂停或终止
kill()
:发送信号到某个或一组进程
ptrace()
:设置执行断点(breakpoint),允许父进程控制子进程的运行
二、fork()命令
调用格式:pid=fork()
在调用fork()之后,父进程和子进程均在下一条语句上继续运行。
父、子进程的fork返回值不同。在子进程中返回时,pid为0;在父进程中返回时,pid为所创建的子进程的标识。
fork()创建子进程之后,执行返回父进程,或调度切换到子进程或其他进程。
fork创建一个新进程(子进程),除了子进程标识符和其PCB结构中的某些特性参数不同之外,子进程是父进程的精确复制。
父、子进程的运行是无关的,所以运行顺序也不固定。若要求父子进程运行顺序一定,则要用到进程间的通信。
三、fork()调用例子
例1
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
void main(){
printf("Hello \n");
fork();
printf("Bye \n");
}
运行结果
Hello
Bye
Bye
例2
#include<stdio.h>
#include<unistd.h>
int main(){
int i;
for(i=0;i<3;i++)
fork();
printf("hello, world\n");
return 0;
}
一共输出多少个hello, world?
3次fork,总共会有个进程,每个进程打印一个"hello, world",一共8个。
例3
void main(void){
int i;
static char buffer[10];
if(fork()==0)
strcpy(buffer,"Child\n");
for(i=0;i<5;++i){
sleep(1);
write(1,buffer,sizeof(buffer));
}
}
程序的运行无法保证输出顺序,输出顺序依赖于内核所用的调度算法。
例4
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int global=4;
void main(void){
int pid;
int vari=5;
printf("before fork\n");
if((pid=fork())<0){
printf("fork error\n");
exit(0);
}else if(pid==0){
global++;
vari--;
}
printf("global=%d,vari=%d\n",global,vari);
}
父进程运行结果?子进程运行结果?
// 父进程
global=4,vari=5
// 子进程
global=5,vari=4