普通单进程筛质数:
eg:
#include #include#include
#define LEFT 30000000
#define RIGHT 30000200
int main(void)
{inti , j , mark ;for(i = LEFT ; i < RIGHT ; i++)
{
mark= 1;for(j = 2 ;j < i/2 ; j++)
{if(i % j == 0)
{
mark= 0;break;
}
}if(mark)
printf("%d is a primer",i);
}
exit(0);
}
[root@localhost pro]# ./primer | wc -l 管道计数 记行数
18
[root@localhost pro]# time ./primer > /tmp/out
real 0m1.059s用户的体验时间
user0m0.976s
sys0m0.004s
=================================================================
wait函数
/**********wait()需要的库函数******/#include#include
/*****************
*功能:等待进程状态发生变化
*参数:进程状态:把当前的子进程收尸的状态放到一个整型的变量中去
WIFEXITED:是否正常终止,返回真
WEXITSTATUS:进程结束的状态(前提正常结束返回状态)
WIFSIGNALED:信号终止的返回真
WTERMSIG:返回信号编号(信号打断)
......
*返回值:成功返回终止的子进程的ID号,失败返回-1
*****************/pid_t wait(int *status);
waitpid()函数
#include #include
/**********************************
*功能:等待进程状态发生变化
*参数:pid:pid > 0:收子进程的进程ID号
* pid = 0:收任何的同组的子进程
* pid =-1:收任何子进程
* pid < -1:收任何同组的绝对值的子进程eg:pid = -5 那么收 同组pid = 5 的子进程
* status:将进程结束后的状态存储到整型变量中
* options:位图:WNOHANG:如果没有任何子进程立刻退出
* wait是阻塞,加上WNOHANG就是非阻塞
*返回值:成功返回子进程ID,如果WNOHANG被使用子进程状态未发生变化成功返回0,失败返回-1
* ********************************/pid_t waitpid(pid_t pid ,int *status ,int options);
eg:修改后
创建了201个子进程做这个工作,不建议使用。
#include #include#include#include#include
#define LEFT 30000000
#define RIGHT 30000200
int main(void)
{inti , j , mark ;
pid_t pid ;//0.父进程负责累加和创建进程
for(i = LEFT ; i < RIGHT ; i++)
{//1.创建RIGHT - LEFT 个进程
pid =fork();if(pid < 0)
{
perror("fork()");
exit(1);
}//2.子进程处理
if(pid == 0)
{
mark= 1;for(j = 2 ;j < i/2 ; j++)
{if(i % j == 0)
{
mark= 0;break;
}
}if(mark)
printf("%d is a primer",i);
exit(0);
}
}//3.收尸
for(i = LEFT ; i<=RIGHT ;i++)
wait(NULL);
exit(0);
}
==========================================================================
子进程使用同一块物理内存空间
如果只读方式,父子进程都不会改变物理内存空间
如果父子进程想要修改某块物理内存
1.首先把物理内存模块copy一份
2.修改页表指针指向copy后的地址
3.修改自己的那块物理内存空间,谁想修改谁copy.