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

本文介绍了一个简单的单进程筛选质数的C程序,并通过创建多个子进程来优化质数筛选过程的方法。此外,还详细解释了wait和waitpid函数在进程管理中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

普通单进程筛质数:

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.

 

转载于:https://www.cnblogs.com/muzihuan/p/5284371.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值