zoukankan      html  css  js  c++  java
  • 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
    ",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 ",i); exit(0); } } //3.收尸 for(i = LEFT ; i<=RIGHT ;i++) wait(NULL); exit(0); }

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

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

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

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

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

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

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

  • 相关阅读:
    Shell编程进阶 2.2 shell数组
    Shell编程进阶 2.1 shell函数
    win7将 esc与 capslock 互换
    Vimium 快捷键记录
    mysql-server 的一些记录
    2003服务器断开rdp后会自动注销。
    CentOS云服务器数据盘分区和格式化
    autoproxy 规则
    理解MySQL——索引与优化
    Spinnaker简介
  • 原文地址:https://www.cnblogs.com/muzihuan/p/5284371.html
Copyright © 2011-2022 走看看