2013年(12)
分类: C/C++
2013-12-08 21:31:00
2.2 Linux下的进程控制
在传统的Unix环境下,有两个基本的操作用于创建和修改进程:函数fork( )用来创建一个新的进程,该进程几乎是当前进程的一个完全拷贝;函数族exec( )用来启动另外的进程以取代当前运行的进程。Linux的进程控制和传统的Unix进程控制基本一致,只在一些细节的地方有些区别,例如在Linux系统中调用vfork和fork完全相同,而在有些版本的Unix系统中,vfork调用有不同的功能。由于这些差别几乎不影响我们大多数的编程,在这里我们不予考虑。
2.2.1 fork( )
fork在英文中是"分叉"的意思。为什么取这个名字呢?因为一个进程在运行中,如果使用了fork,就产生了另一个进程,于是进程就"分叉"了,所以这个名字取得很形象。下面就看看如何具体使用fork,这段程序演示了使用fork的基本框架:
#include
#include
#include
int main()
{
pid_t ret;
ret=fork();
if(ret==0)
{
//子进程
printf("this is child process!\n");
}
else if(ret>0)
{
//父进程
printf("this is parent process!\n");
}
else
exit(1);//创建失败
return 0;
}
编译运行后两个printf都会打印出来,他们的先后是随机的;
2.pid_t vfork():头文件:#include
在创建子进程后将会是子进程先运行
例子:
#include
#include
#include
int main()
{
pid_t ret;
ret=vfork();
if(ret==0)
{
//子进程
printf("this is child process!\n");
}
else if(ret>0)
{
//父进程
printf("this is parent process!\n");
}
else
exit(1);//创建失败
return 0;
}
编译运行后将先打印this is child process!后打印this is parent process!
####下面简单介绍一下fork()和vfork()的区别
1.fork():子进程将拷贝父进程的数据段和堆栈段;vfork():子进程将与父进程共享数据段和堆栈段
例子
#include
#include
#include
int main()
{
pid_t ret;
int count=0;
ret=fork();
count++;
printf("count:%d\n",count);
return 0;
}
编译运行结果:两个count打印的都是1
如果将fork()换成vfork()运行结果是:
2.fork():子进程和父进程的运行顺序将是随机的;vfork():将是子进程先运行
#include
#include
#include
int main()
{
pid_t ret;
ret=fork();
if(ret==0)
{
for(int i=0;i<10;i++)
printf("child\n");
}
else if(ret>0)
{
for(int i=0;i<10;i++)
printf("parent\n");
}
else
exit(1);//创建失败
return 0;
}
结果将看到:child 和parent 随机输出
如果将fork()换成vfork()运行结果是:输出child
若fork()想让子进程先运行可以在父进程中使用wait()函数