进程的基本操作及应用。


一。进程创建:

主要用fork()函数创建进程,当调用fork时,内核会做:

(1)分配新的内存块和内核数据结构给子进程。

(2)将父进程部分数据内容拷贝至子进程。

(3)添加子进程到系统进程列表当中。

(4)fork返回,开始调度器调度。

举例:

 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 #include<sys/types.h>
  5 
  6 int main(void)
  7 {
  8         pid_t pid;
  9         printf("before: pid is %d\n",getpid());
 10         if( (pid=fork())==-1)perror("fork()"),exit(1);
 11         printf("after:pid is %d,fork return %d\n",getpid(),pid);
 12         sleep(10);
 13 }

所以,fork之前父进程独立执行,fork之后,父子两个执行流分别执行。

fork的返回值:子进程返回0,父进程返回的是子进程的id。

fork调用失败的原因:(1)系统中有太多的进程。(2)实际用户的进程数超越了限制。

Linux中还有一个vfork函数:

(1)它用于创建一个子进程,而子进程与父进程共享地址空间,fork的子进程具有独立地址空间。

(2)vfork保证子进程先运行,在它调用exec之后父进程才可能被调用。

注:fork不能通过更改子进程中的变量值来改变父进程中的变量值,而vfork可以,因为它的子进程在父进程的地址空间运行。

举例:

#include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 
  5 int flag=10;
  6 int main(void)
  7 {
  8     pid_t pid;
  9     if((pid=vfork())==-1)perror("fork()"),exit(1);
 10     if(pid==0)
 11     {
 12         sleep(3);
 13         flag=1;
 14         printf("child flag is %d\n",flag);
 15         exit(0);
 16         }
 17     else{
 18     printf("parent flag=%d\n",flag);
 19
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值