问题描述
- ubuntu上进程生成并且调度子进程执行不同的任务
-
如何编写一个总进程调度其他的子进程执行不同的任务,可不可以发点代码,实例讲解一下,个人较笨,才开始看关于进程的知识,照着书上敲了一天结果是错的
解决方案
#include
#include
#include
int global;//全局变量,在数据段中
int main()
{
pid_t pid;
int stack =1;//局部变量,在栈中
int *heap;
heap = (int*)malloc(sizeof(int));//动态分配内存,在堆中
*heap = 2;//把申请的内存的内容设置为2
pid = fork();//创建子进程
if(pid<0)
{
printf("Fail to forkn");
exit(1);
} else if (pid==0) {//这是子进程
global++;
stack++;
(*heap)++;
printf("the child ,data:%d,stack:%d,heap:%dn",global,stack,*heap):
exit(0); }//子进程运行结束
sleep(2);//父进程休眠2秒钟,保证子进程先运行
printf("the parent,data:%d,stack:%d,heap:%dn",global,stack,*heap);
return 0;
}
代码是摘抄的一段,我在FEDORA 21上,运行没有问题。在创建子进程的方式还有一个,就是用vfork(),这个函数可以保证子进程先于父进程运行,fork()函数创建的子进程在没有其他措施的情况下,比如用了WAIT(),和waitpid()措施,父子进程运行的先后是不确定的。
fork()函数创建的子进程会复制父进程的数据段,堆栈段,但是不复制代码段。就是说子进程的动作不会影响父进程的结果,上面的代码可以说明这一点。
vfork()则会复制父进程的代码段,这会影响父进程的结果。你可以试着把上述代码的fork()替换为vfork(),再观察运行结果,也可以验证。