linux高编进程-------筛质数

普通单进程筛质数:

eg:

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

#define LEFT    30000000
#define RIGHT   30000200

int main(void)
{
    int i , 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\n",i);
    }
    exit(0);
}

[root@localhost pro]# ./primer | wc -l   管道计数  记行数
18
[root@localhost pro]# time ./primer > /tmp/out

real 0m1.059s用户的体验时间
user 0m0.976s
sys 0m0.004s

=================================================================

wait函数

/**********wait()需要的库函数******/
#include <sys/types.h>
#include <sys/wait.h>
/*****************
 *功能:等待进程状态发生变化
 *参数:进程状态:把当前的子进程收尸的状态放到一个整型的变量中去
                  WIFEXITED:是否正常终止,返回真
                  WEXITSTATUS:进程结束的状态(前提正常结束返回状态)
                  WIFSIGNALED:信号终止的返回真
                  WTERMSIG:返回信号编号(信号打断)
                  ......
 *返回值:成功返回终止的子进程的ID号,失败返回-1
 *****************/
pid_t wait(int *status);

waitpid()函数

#include <sys/types.h>
#include <sys/wait.h>
/**********************************
 *功能:等待进程状态发生变化
 *参数: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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define LEFT 30000000 #define RIGHT 30000200 int main(void) { int i , 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\n",i); exit(0); } } //3.收尸 for(i = LEFT ; i<=RIGHT ;i++) wait(NULL); exit(0); }

========================================================================== 

子进程使用同一块物理内存空间

如果只读方式,父子进程都不会改变物理内存空间

如果父子进程想要修改某块物理内存

1.首先把物理内存模块copy一份

2.修改页表指针指向copy后的地址

3.修改自己的那块物理内存空间,谁想修改谁copy.

 

posted @ 2016-03-17 09:59  muzihuan  阅读(438)  评论(0编辑  收藏  举报