那年,一步一步学linux c ---“侠肝义胆”之进程

转自:http://blog.csdn.net/muge0913/article/details/7315522

那年,一步一步学linux c ---“侠肝义胆”之进程

分类: 嵌入式linux c 编程 2391人阅读 评论(6) 收藏 举报

转载请注明出处:http://blog.csdn.net/muge0913/article/details/7315522

如果我们把计算机上的操作系统及各种各样的软件看成一系列的有机生命,而不是指令集,那么这就是一个进程的世界,在进程的世界中同样有“道德”和“法制法规”,窥探进程世界,看它的侠肝义胆,风雨江湖路~~~~~

linux支持多个进程同时进行,也就是我们常说的现代操作系统中的多道程序设计,所谓同时是linux系统调度各个进程分别占用cpu的时间。由于每个时间片的时间很小和宏观时间相比,给人的感觉是多个进程在运行。

注:总结下就是在微观是串行,在宏观上是并行。

为了提高程序的运行效率,程序往往分成多个部分组成,这也就是说的并发程序设计。并发程序中各进程是相互独立的,在必要的时候会通过相应的机制进行通信。若进程间要共享资源,为了避免出现冲突,常通过相应通信机制使它们轮流使用共享资源。在进程进行通信时,会出现一个进程等另一个进程完,才能继续运行的情况,这也需要进程间通信以了解对方的运行情况。有时进程间会出现互斥现象,这是会用到锁机制。在并发程序设计中,进程的创建和结束是由用户决定的。这也就出现了父进程和子进程概念。

进程的创建:

  1. #include <unistd.h>
  2. pid_t fork(void);
  3. pid_t vfork(void);
#include <unistd.h>

pid_t fork(void);

pid_t vfork(void);


在这简述,fork创建的子进程是父进程的一个拷贝,但是和父进程使用不同的数据段和堆栈。vfork和fork基本相同但是vfork不会复制父进程的数据段,它们共享数据段。这是因为vfork常和exec函数使用去调用一个程序如ls命令,开启一个新的进程。vfork后父进程会等待子进程运行结束或调用了exit。fork后父进程和子进程的运行顺序是不确定的。

下面是体现它们性质的程序:

  1. #include <sys/types.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. main()
  6. {
  7. pid_tpid;
  8. char*pchar = "before fork";
  9. inttest_va = 1;
  10. if((pid= fork()) < 0 )
  11. {
  12. printf("forkerror!!\n");
  13. exit(1);
  14. }
  15. elseif(pid == 0)
  16. {
  17. printf("childprocess\n");
  18. pchar= "child pchr\n";
  19. printf("%s\n",pchar);
  20. test_va= 2;
  21. printf("%d\n",test_va);
  22. _exit(2);
  23. }
  24. else
  25. {
  26. printf("parentprocess\n");
  27. //sleep(1);
  28. printf("%s\n",pchar);
  29. printf("%d\n",test_va);
  30. }
  31. }
#include <sys/types.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

 

main()

{

     pid_tpid;

     char*pchar = "before fork";

     inttest_va = 1;

     if((pid= fork()) < 0 )

     {

     printf("forkerror!!\n");

     exit(1);

     }

     elseif(pid == 0)

     {

     printf("childprocess\n");

     pchar= "child pchr\n";

     printf("%s\n",pchar);

     

     test_va= 2;

     printf("%d\n",test_va);

     _exit(2);

     }

     else

     {

     printf("parentprocess\n");

     //sleep(1);

     printf("%s\n",pchar);

     printf("%d\n",test_va);

     }

}


把上面的fork改为vfork即可

fork:

vfork:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值