Linux编程:多线程和多进程实现

7 篇文章 0 订阅
7 篇文章 0 订阅

一、问题描述

1号进程创建2,3号两个进程
2号进程创建两个线程Thread1,Thread2
Thread1:求(1~n)之间的素数
Thread2:生成Fibonacci序列
3号进程创建4,5号两个进程
4号进程执行系统命令,ls,ps,cp等
5号进程执行一个用户编写的可执行文件
每个进程输出自己的进程ID和父进程的进程ID

二、代码

/*
 * OSPro1.c
 *
 *  Created on: Nov 10, 2016
 *      Author: koalazb
 */

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

//Fibonacci sequence
void Fibonacci()
{
	int f[100]={0};
	f[0] = 0;
	f[1] = 1;
	printf("Fibonacci sequence is: ");
	int a;
	for(a=2;a<10;a++)
	{
		f[a]= f[a-1] + f[a-2];
	}
	for(a=0;a<10;a++)
		printf("%d ",f[a]);
	printf("\n");
	printf("Thread Fibonacci exit\n");
	pthread_exit(0);
}

//Primenumber sequence
void Primenumber(void*arg)
{
	int n = *(int *)arg;
	int i;
	int j;
	int flag;
	printf("Primenumber sequence is: %d ",2);
	for(i=2; i<=n; i++)
	{
		for(j=2; j<i; j++)
		{
			if(i%j == 0){
				flag =0;
				break;
			}
			flag =1;
		}
		if(flag)
			printf("%d ",i);
	}
	printf("\n");
	printf("Thread Primenumber exit\n");
	pthread_exit(0);
}


int main()
{
    pid_t pid_1, pid_2, pid_3; //Declare 3 process
    pid_1 = getpid();

    printf("Parent Pid_1 is %d\n", pid_1);

    if((pid_2 = fork()) == 0) //fork() create children process
    {
        int ret1, ret2;
        pthread_t tid1, tid2; //Declare 2 thread
        printf("Pid_2 is %d, its parent is %d\n", getpid(), getppid());
	int n=20;
        ret1 = pthread_create(&tid1, NULL, (void*)Primenumber, &n); //create thread and execute Primenumber() 

        if(ret1 == 0) 
		printf("Thread_1 ok!\n");
        else 
		printf("Thread_1 failed!\n");
        
        ret2 = pthread_create(&tid2, NULL, (void*)Fibonacci, NULL);//create thread and execute Fibonacci() 

        if(ret2 == 0) 
		printf("Thread_2 ok!\n");
        else 
		printf("Thread_2 failed!\n");

        pthread_join(tid1, NULL);//waitting thread1 finished
        pthread_join(tid2, NULL);//waitting thread2 finished
    }

    if((pid_3 = fork()) == 0 && getppid() == pid_1)
    {
        pid_t pid_4, pid_5;
        printf("Pid_3 is %d, its parent is %d\n", getpid(), getppid());

        if((pid_4 =fork()) == 0)
        {
            printf("Pid_4 is %d, its parent is %d\n", getpid(), getppid());
            int ret3;

            ret3 = execl("/bin/ls", "ls", "-l", NULL);

            if(ret3 < 0) 
		perror("execl error!\n");
            else printf("Successfuly execute the ls -l commond!\n");
        }

        if((pid_5 = fork()) == 0)
        {
            printf("Pid_5 is %d, its parent is %d", getpid(), getppid());
            int ret4;

            ret4 = execl("demo", "./demo", NULL);//execute demo.c (./demo)

            if(ret4 < 0) 
		perror("execl error!\n");
            else 
		printf("Successfuly execute the \"demo\"!\n");
        }

        pid_t cpid = wait(NULL);
        printf("The process 3 exit, and its child process is %d\n", cpid);
    }

    pid_t cpid = wait(NULL); //waitting children process finished
    printf("The process %d exit\n", cpid);
    exit(0);
    return 0;

}

//demo.c
#include <stdio.h>
#include <stdlib.h>

int main()
{
	printf("This is \"demo\" process !\n");
	return 0;
}

三、运行效果

这里写图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值