系统进程

1、进程标识符 PID
pid_t          //进程数据类型

ps        //ps及相关命令
ps axf
ps axm
ps ax -L

pid_t getpid(void);    //获取当前进程PID
pid_t getppid(void);  //获取父进程PID

 

2、进程的产生
pid_t fork(void);
fork后父子进程的区别
1、fork的返回值不一样
2、PID不同
3、ppid不同
4、未决信号和文件锁不继承
5、资源利用量归0

init进程: PID 1 是所有进程的祖先进程
调度器的调度策略来决定哪个进程先运行
fork前执行fflush();

 

3、进程收尸

pid_t wait(int *status);

pid_t waitpid(pid_t pid, int *status, int options);

 

创建进程

fork示例:fork0.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
  pid_t pid;

  printf("[%d]:begin\n",getpid());

  fflush(NULL);       //fork前刷新数据流(不刷新会出错)

  pid = fork();     //fork新进程
  if(pid<0)    //当返回值小于0时报错退出
  {
    perror("fork()");
    exit(1);
  }
  else if(pid ==0)  //返回值为0时表示子进程
  {
    printf("[%d]:child is running\n",getpid());
  }
  else    //父进程
  {
    printf("[%d]:parent is running\n",getpid());
  }

  printf("[%d]:end\n",getpid());
  exit(0);
}

 

筛质数

示例0:primer0.c (一个进程循环计算)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define LEFT 300000
#define RIGHT 300200

int main()
{
  int i,j;
  int mark;

  for(i=LEFT;i<=RIGHT;i++)
  {
    mark =1;
    for(j=2;j<i/2;j++)
    {
      if(i%j==0)
      {
        mark = 0;  //当能整除时标志置0  并退出循环
        break;
      }
    }
    if(mark)
    printf("%d is primer\n",i);
  }

  exit(0);
}

 

示例1:primer1.c (创建201个进程每个进程计算一个数据)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define LEFT 300000
#define RIGHT 300200

int main()
{
  int i,j;
  int mark;
  pid_t pid;

  for(i=LEFT;i<=RIGHT;i++)
  {
    pid = fork();  //fork新进程
    if(pid<0)
    {
      perror("fork()");
      exit(1);
    }
    else if(pid ==0)  //子进程处理
    {
      mark =1;
      for(j=2;j<i/2;j++)
      {
        if(i%j==0)
        {
          mark = 0;
          break;
        }
      }
      if(mark)
      printf("%d is primer\n",i);
      exit(0);  //子进程处理完后退出        
    }
  }

  exit(0);
}

 

示例2:primerN.c (创建3个进程交叉计算wait收尸)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#define LEFT 300000
#define RIGHT 300200
#define N 3    //定义子进程数

int main()
{
  int i,j,n;
  int mark;
  pid_t pid;

  for(n=0;n<N;n++)  
  {
    pid = fork();  //父进程循环创建子进程

    if(pid <0)
    {
      perror("fork()");
      exit(1);
    }
    else if(pid ==0)  //子进程处理数据
    {
      for(i=LEFT+n;i<=RIGHT;i+=N)  //交叉处理数据
      {
        mark =1;
        for(j=2;j<i/2;j++)
        {
          if(i%j==0)
          {
            mark = 0;
            break;
          }
        }
        if(mark)
          printf("[%d]:%d is primer\n",n,i);
      }
      exit(0);  //处理完成退出子进程
    }
  }

  for(n=0;n<N;n++)  //对子进程收尸
    wait(NULL);

  exit(0);
}

 

posted @ 2022-07-11 20:46  *^VV^*  阅读(64)  评论(0编辑  收藏  举报