版权声明:本文为博主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
运行效果: