系统进程
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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现