linux中进程的控制总结,Linux中的进程控制

我们知道,程序就是一个包含可执行代码的文件,是一个静态的文件。

进程就是可执行程序的一次执行过程,是一个动态的概念,在Linux系统中所有运行的东西都可以称之为进程。

进程的基本状态三种:运行态、就绪态和阻塞态(或等待态)。

下面我们来介绍一下进程控制中的相关函数:

1、fork函数

fork函数的功能是产生子进程,子进程会完全复制父进程的资源,并且子进程的执行完全独立于父进程,调用一次会有两个返回值,在子进程里面返回0,在父进程里面返回子进程的pid号,fork函数存在于头文件#include

一个简单的例子:

#include

#include

#include

int main(){

int p_id;

p_id=fork( );

if (p_id==0)

printf("child process\n");

else

printf("parent process\n");

}

在这里需要注意的是fork函数创建进程以后父子进程所随机运行的,并没有谁先谁后一说。所以如果父进程先结束,子进程就变成了孤儿进程,这对于一个程序来说是不能允许的错误,所以如果希望父进程在子进程结束后再结束,可以使用wait函数:

pid_t wait (int * status); (头文件: wait.h)

wait函数会“暂停”目前进程的执行,直到有信号来到或子进程结束

如果在调用 wait()时子进程已经结束,则 wait()会“立即”返回子进程结束状态值,如果有错误发生则返回返回值-1。失败原因存于 errno 中。

子进程的结束状态值(如exit函数中的值)会存放在参数 status 中, 而wait函数的返回值是子进程的进程号

waitpid:pid_t waitpid(pid_t pid, int * status, int options);

等待指定的子进程结束

简单的例子:

int main()

{ pid_t pc, pr;

pc=fork();

if(pc<0) printf("Error fork.\n");

else if(pc==0){

sleep(10);

exit(0);

}

else{

pr = waitpid(pc, NULL, 0);

if(pr==pc)

printf("Get child %d\n",pr);

else

printf("some error occured.\n");

}

}

这样父进程就会在子进程执行结束以后再执行。

下面我们来探讨一下更高级的问题,如何来创建多个子进程呢,我们知道父子进程都会执行除了进程控制的其他语句,如果我们直接调用fork函数就会创建数不清的进程,比如:

int main(){

int p_id;

p_id=fork( );

if (p_id==0)

printf("child process 1\n");

else

{

wait();

printf("parent process 1\n");

}

p_id=fork( );

if (p_id==0)

printf("child process 2\n");

else

{

wait();

printf("parent process 2\n");

}

}

那么如何避免这种情况呢,最简单的方法就是使用进程链:

#include

#include

#include

int main(){

int i;

pid_t child_pid;

for(i=1;i<3;i++)

{

child_pid = fork();

if( child_pid==0 )

{ printf( "do something \n"); return 0;}

else{ wait(); }

}

return 0;

}

我们用一个return语句来退出if语句执行下一个进程创建函数,这样就避免了子进程在创建子进程的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值