linux 操作系统 创建多个子进程

本文介绍如何在Linux操作系统中使用fork()系统调用创建两个子进程。每个子进程将显示其进程ID,而父进程在等待所有子进程结束后显示相应的结束信息。通过在子进程结束时返回0,父进程可以继续创建更多子进程,利用waitpid()等待子进程的结束。

1、编写一段程序实现以下功能:

a)       使用系统调用fork()创建两个子进程

b)       各个子进程显示和输出一些提示信息和自己的进程标识符。

c)       父进程显示自己的进程ID和一些提示信息,然后调用waitpid()等待多个子进程结束,并在子进程结束后显示输出提示信息表示程序结束。


2、

创建两个子进程的代码如下:

#include <unistd.h>
#include <stdarg.h>
#include <time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
 
int tprintf (const char *fnt,...);
 
int main(void)
{
       pid_tpid1,pid2;
       inti;
       printf("Hellofrom parent process,pid is %d.\n",getpid());
      
       pid1=fork();
      
       if(pid1==0)
       {
              sleep(1);
              for(i=0;i<3;i++)
              {
                     tprintf("Hellofrom child NO.1 process %d. %d times\n",getpid(),i+1);
                     sleep(1);
              }
   
### MPI 并行编程实现向量相加 MPI(Message Passing Interface)是一种广泛使用的并行计算工具,用于在分布式内存环境中进行消息传递。以下是一个完整的示例代码,展示如何使用 MPI 编写并行程序来计算个向量的和。 #### 示例代码 以下代码展示了如何使用 MPI 实现个向量的并行相加操作。每个进程负责处理向量的一部分数据,并将结果发送到根进程进行汇总。 ```c #include <mpi.h> #include <stdio.h> #include <stdlib.h> // 读取向量函数 void Read_vector(double *local_a, int local_n, int n, double *A, int my_rank, MPI_Comm comm) { if (my_rank == 0) { for (int i = 0; i < n; i++) { A[i] = i + 1; // 初始化向量值 } } MPI_Scatter(A, local_n, MPI_DOUBLE, local_a, local_n, MPI_DOUBLE, 0, comm); } // 向量相加函数 void Parrel_vector_sum(double *local_a, double *local_b, double *local_c, int local_n) { for (int i = 0; i < local_n; i++) { local_c[i] = local_a[i] + local_b[i]; } } // 打印向量函数 void Print_vector(double *local_c, int local_n, int n, double *C, int my_rank, MPI_Comm comm) { MPI_Gather(local_c, local_n, MPI_DOUBLE, C, local_n, MPI_DOUBLE, 0, comm); if (my_rank == 0) { printf("Resultant Vector:\n"); for (int i = 0; i < n; i++) { printf("%f ", C[i]); } printf("\n"); } } int main(int argc, char *argv[]) { MPI_Init(&argc, &argv); int n = 10; // 向量长度 int my_rank, num_procs; MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); int local_n = n / num_procs; // 每个进程分配的向量长度 double *local_a = (double *)malloc(local_n * sizeof(double)); double *local_b = (double *)malloc(local_n * sizeof(double)); double *local_c = (double *)malloc(local_n * sizeof(double)); double *A = NULL, *B = NULL, *C = NULL; if (my_rank == 0) { A = (double *)malloc(n * sizeof(double)); B = (double *)malloc(n * sizeof(double)); C = (double *)malloc(n * sizeof(double)); } // 初始化向量 A 和 B Read_vector(local_a, local_n, n, A, my_rank, MPI_COMM_WORLD); Read_vector(local_b, local_n, n, B, my_rank, MPI_COMM_WORLD); // 计算向量和 Parrel_vector_sum(local_a, local_b, local_c, local_n); // 打印结果 Print_vector(local_c, local_n, n, C, my_rank, MPI_COMM_WORLD); free(local_a); free(local_b); free(local_c); if (my_rank == 0) { free(A); free(B); free(C); } MPI_Finalize(); return 0; } ``` #### 代码说明 1. **向量初始化**:`Read_vector` 函数用于初始化向量 `A` 和 `B`,并将它们分散到各个进程中[^2]。 2. **向量相加**:`Parrel_vector_sum` 函数负责对局部向量进行相加操作[^2]。 3. **结果收集**:`Print_vector` 函数通过 `MPI_Gather` 将所有进程的结果收集到根进程,并打印最终结果[^1]。 4. **内存管理**:确保为每个进程分配足够的内存,并在程序结束时释放动态分配的内存。 #### 注意事项 - 确保向量长度 `n` 能被进程数整除,否则需要额外处理剩余元素。 - 使用 `MPI_Scatter` 和 `MPI_Gather` 进行数据分发和收集[^1]。 - 在实际应用中,可以根据需要调整向量初始化逻辑。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值