实验 多线程和多进程的调度和管理

版权声明:本文为博主SangHuiXianSheng原创文章,转载请注明出处。 https://blog.csdn.net/qq_40589281/article/details/83240071

实验 多线程和多进程的调度和管理

实验内容

进程创建关系如图所示在这里插入图片描述
1号进程创建2,3号两个进程
2号进程创建两个线程Thread1, Thread2
Thread1:求(1~n)之间的素数
Thread2:生成Fibonacci序列
3号进程创建4,5号两个进程
4号进程执行系统命令,ls,ps,cp等
5号进程执行一个用户编写的可执行文件
每个进程输出自己的进程ID和父进程的进程ID,观察分析,并画出程序的进程树结构

/*
 * process_1.c
 *
 *  Created on: 2018-10-18
 *      Author: SangHui
 *       Email:[email protected]
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <sys/types.h>

void* primeNumber() {
	printf("求 1~n 之间的素数 请输入 n:");
	int n;
	scanf("%d", &n);
	int i;
	int j;
	for (i = 2; i <= n; i++) {
		for (j = 2; j <= i / 2; j++) {
			if (i % j == 0) {
				break;
			}
		}
		if (j > i / 2) {
			printf("%d ", i);
		}
	}
	printf("\n");
	return NULL;
}
void* Fibonacci() {
	printf("生成25位Fibonacci序列:\n");
	long long Fibonacci[25];
	Fibonacci[0] = Fibonacci[1] = 1;
	int i;
	for (i = 2; i <= 24; i++) {
		Fibonacci[i] = Fibonacci[i - 1] + Fibonacci[i - 2];
	}
	/* 输出 每10位换一行*/
	for (i = 0; i <= 24; i++) {
		printf("%d ", Fibonacci[i]);
		if (i % 10 == 9)
			printf("\n");
	}
	printf("\n");
	return NULL;

}
int thread_two() {
	int i;
	for (i = 0; i <= 1; i++) {
		pthread_t pid;
		pthread_attr_t attr;

		pthread_attr_init(&attr);
		switch (i) {
		case (0):
			pthread_create(&pid, &attr, primeNumber, NULL);
			pthread_join(pid, NULL);
			break;

		case (1):
			pthread_create(&pid, &attr, Fibonacci, NULL);
			pthread_join(pid, NULL);
			break;
		}
	}
	return 0;
}

void fun( i) {
	switch (i) {
	case (4): {
		printf("----进入进程4,进程ID:%d\n", getpid());
		printf("----这里是进程4,父进程ID:%d\n\n", getppid());

		char a[2] = "";
		printf("Please input \"ls\" or \"ps\" or \"cp\"\n");
		while (1) {
			scanf("%s", a);
			char b[10] = "/bin/";
			strcat(b, a);
			if (strcmp(a, "ls") == 0 || strcmp(a, "ps") == 0) {
				execlp(b, a, NULL);
			} else if (strcmp(a, "cp") == 0) {

				printf("请输入cp命令的操作数\ncp ");
				char option[3];
				scanf("%s", option);
				char sourceFile[10];
				scanf("%s", sourceFile);
				char objectFile[10];
				scanf("%s", objectFile);

				execlp(b, a, option, sourceFile, objectFile,NULL);
			} else {
				printf(
						"INVALID ENTRY    Please input \"ls\" or \"ps\" or \"cp\"\n");
			}
		}
	}
	case (5):
		printf("-----进入进程5,进程ID:%d\n", getpid());
		printf("-----这里是进程5,父进程ID:%d\n", getppid());
		/*
		 *  进程5调用一个可执行程序
		 */
		 printf("/*\n* 进程5调用一个可执行程序\n* (可用execlp(); 实现)\n */\n");
		break;
	default:
		exit(-1);
	}
}
int createProcessTwo() {
	int i;
	for (i = 4; i <= 5; i++) {
		pid_t pid;
		pid = fork();
		if (pid < 0) {
			fprintf(stderr, "Fork Failed");
			exit(-1);
		}
		if (pid == 0) {
			fun(i);
		}
		if (pid > 0) {
			wait(NULL);
		}
	}
	return 0;
}
void childFun(int i) {
	switch (i) {
	case (2): //如果是 2 号进程,则调用 thread_two()函数,创建两个线程
		printf("--进入进程2,进程ID:%d\n", getpid());
		printf("--这里是进程2,父进程ID:%d\n\n", getppid());
		thread_two();

		printf("--进程2执行结束\n");
		break;
	case (3): //如果是 3 号进程,则调用 process_two()函数,创建两个进程
		printf("---进入进程3,进程ID:%d\n", getpid());
		printf("---这里是进程3,父进程ID:%d\n\n", getppid());
		createProcessTwo();
		break;
	}
}
int createProcess() {

	int i;
	for (i = 2; i <= 3; i++) {
		pid_t pid;
		pid = fork();
		if (pid < 0) {
			fprintf(stderr, "Fork Failed");
			exit(-1);
		}
		if (pid == 0) {
			childFun(i);
			exit(0);
		}
		if (pid > 0) {
			wait(NULL);
		}
	}
	return 0;
}

int main() {

	printf("-进入进程1,进程ID:%d\n", getpid());
	printf("-这里是进程1,父进程ID:%d\n\n", getppid());
	createProcess();
	printf("进程1执行结束(所有程序结束)\n");
	return 0;
}

(这里为了方便没有写供进程5调用的程序)
编译:

[SangHui@Hui osCode_1]$ gcc process_1.c -o process -lpthread

运行效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40589281/article/details/83240071