Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1056470
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: LINUX

2015-12-02 16:27:05

fork.c文件

点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <unistd.h>

  6. int global = 6;
  7. char gbuf[] = "fork测试:\n";

  8. int main(int argc, char * * argv, char * * envp)
  9. {
  10.     int jubu_var = -1;
  11.     pid_t pid;
  12.     jubu_var = 88;
  13.     int ret = -1;
  14.     
  15.     ret = write(STDOUT_FILENO, gbuf, sizeof(gbuf)-1);
  16.     printf("before fork!\n");
  17.     
  18.     pid = fork();
  19.     if(pid < 0)
  20.     {
  21.         printf("fork err!\n");
  22.     }
  23.     else if(pid == 0) /*子进程*/
  24.     {
  25.         //sleep(1);
  26.         printf("子进程pid=[%d]!\n", getpid());
  27.         global++;
  28.         jubu_var++;
  29.     }
  30.     else
  31.     {
  32.         printf("父进程pid=[%d]!\n", getpid());
  33.         sleep(1);
  34.     }
  35.     
  36.     /*子进程,父进程继续执行fork调用之后的指令:
  37.     printf("pid=[%d], global=[%d], jubu_var=[%d]\n", getpid(), global, jubu_var);
  38.     
  39.     /*注意:子进程是父进程的副本。
  40.     子进程获得父进程数据段,堆,栈的副本,物理空间是相同,但是逻辑空间并不相同。
  41.     所以说,父,子进程并不共享这些存储空间部分。但是,父,子进程共享正文段。*/
  42.     
  43.     return 0;
  44. }
vfork.c文件

点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <unistd.h>

  6. int global = 6;
  7. char gbuf[] = "vfork测试:\n";

  8. int main(int argc, char * * argv, char * * envp)
  9. {
  10.     int jubu_var = -1;
  11.     pid_t pid;
  12.     jubu_var = 88;
  13.     int ret = -1;
  14.     
  15.     ret = write(STDOUT_FILENO, gbuf, sizeof(gbuf)-1);
  16.     printf("before fork!\n");
  17.     
  18.     pid = vfork();
  19.     if(pid < 0)
  20.     {
  21.         printf("vfork err!\n");
  22.     }
  23.     else if(pid == 0) /*子进程*/
  24.     {
  25.         printf("子进程pid=[%d]!\n", getpid());
  26.         global++;
  27.         jubu_var++;
  28.         exit(0);
  29.     }
  30.     else
  31.     {
  32.         printf("父进程pid=[%d]!\n", getpid());
  33.     }
  34.     
  35.     /*子进程,父进程继续执行fork调用之后的指令:
  36.     printf("pid=[%d], global=[%d], jubu_var=[%d]", getpid(), global, jubu_var);
  37.     
  38.     /*注意:子进程是父进程的副本。
  39.     子进程获得父进程数据段,堆,栈的副本,物理空间是相同,但是逻辑空间并不相同。
  40.     所以说,父,子进程并不共享这些存储空间部分。但是,父,子进程共享正文段。*/

  41. }
下面代码不会产生僵死进程

点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <sys/wait.h>

  6. int main(int argc, char * * argv, char * * envp)
  7. {
  8.     printf("options 参数 WCONTINUED = [%d]\n", WCONTINUED);
  9.     printf("options 参数 WCONTINUED = [%d]\n", WNOHANG);
  10.     printf("options 参数 WCONTINUED = [%d]\n", WUNTRACED);
  11.     
  12.     pid_t pid;
  13.     
  14.     pid = fork();
  15.     if(pid < 0)
  16.     {
  17.         printf("fork 子进程 err!\n");
  18.     }
  19.     else if(pid == 0) /*子进程*/
  20.     {
  21.         pid = fork();
  22.         if(pid < 0)
  23.         {
  24.             printf("fork 孙子进程 err!\n");
  25.         }
  26.         else if(pid > 0) /*子进程*/
  27.         {
  28.             printf("子进程=[%d], 此时的父进程=[%d]\n", getpid(), getppid());
  29.             exit(0);
  30.         }
  31.         /*下面是孙子进程 : 一旦子进程结束,孙子进程就变成孤儿进程,由init进程托管:所以不会再出现僵尸进程了*/
  32.         while(getppid() != 1)
  33.             sleep(1);
  34.         printf("孙子进程=[%d], 此时的父进程=[%d]\n", getpid(), getppid());
  35.         
  36.         exit(0);
  37.     }
  38.     /*下面是父进程*/
  39.     printf("pid=[%d]\n", pid);
  40.     if(waitpid(pid, NULL, 0) != pid) /*等待子进程结束*/
  41.     {
  42.         printf("waitpid err!\n");
  43.     }
  44.     exit(0);
  45. }

阅读(343) | 评论(0) | 转发(0) |
0

上一篇:文件锁

下一篇:printf格式化打印

给主人留下些什么吧!~~