linux进程的创建fork,linux创建进程fork的方法步骤

fork创建进程

函数原型如下

#include// 必须引入头文件,使用fork函数的时候,必须包含这个头文件,否则,系统找不到fork函数

pid_t fork(void); //void代表没有任何形式参数

父进程与子进程

1.掌握概念,什么是父进程,什么是子进程

除了0号进程(系统创建的)之外,linux系统中都是由其他进程创建的。创建新进程的进程,即调用fork函数的进程为父进程,新建的进程为子进程。

2.fork函数不需要任何参数,对于返回值有三种情况

1)对于父进程,fork函数返回新建子进程的pid;

2)对于子进程,fork函数返回0;

3)如果出错,fork函数返回-1。

创建进程案例(fork.c)

#include

#include

#include

int main(void)

{

pid_t pid ;

pid = fork();

if(pid < 0)

{

printf("fail to fork\n");

exit(1);

}

if(pid == 0)

{

printf("this is the child,pid is : %u\n",getpid());

exit(0);

}

if(pid > 0)

{

printf("this is the parent\n");

exit(0);

}

return 0;

}

在shell中编译该程序如下:

gcc fork.c -o fork

在shell中运行该程序如下:

./fork

最后输出结果:

20180110234709301784.png

再次运行结果如下:

20180110234709304714.png

父子进程共享资源

1.父子进程共享代码段(可读的)

父进程在创建子进程的时候,子进程会把父进程的地址空间里的数据段。和栈堆进行复制,但是没有复制代码段。

2.详细可看具体代码示例(fork_1.c)

fork_1.c

#include

#include

#include

int global; // 全局变量在数据段中

int main()

{

pid_t pid;

int stack = 1; // 局部变量在栈中

int * heap;

heap = (int *)malloc(sizeof(int)); //在堆中

*heap = 2;

pid = fork();

if(pid < 0)

{

printf( " fail to fork\n " ) ;

exit(1) ;

}

if( pid == 0 )

{

global++ ;

stack ++ ;

(*heap)++ ;

printf ( " the child , data : %d , stack : %d , heap : %d\n", global , stack , * heap ) ;

exit(0) ;

}

sleep(2) ;

printf("the parent, data : %d, stack : %d, heap : %d\n", global , stack , *heap);

return 0 ;

}

运行结果如下:

20180110234709316433.png

fork函数出错的情况

1.fork函数返回值为-1即创建失败,有两种情况可能会导致fork函数出错;

2.系统中已经有太多的进程存在;

3.调用fork函数的用户的进程太多。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值