Linux下的进程线程经典实验(哲学家吃饭,生产消费者模型等)

上一周完成任务不是非常的好,所以总结一下,希望这一周能做好


requirement(代码已补全)


1. 进程实验

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <ctype.h>
#include <stdlib.h>
/* 允许建立的子进程个数最大值 */
#define MAX_CHILD_NUMBER 10
/* 子进程睡眠时间 */
#define SLEEP_INTERVAL 2
int proc_number=0;
/* 子进程的自编号,从0开始 */
void do_something();

int main(int argc, char* argv[])
{
   
    /* 子进程个数 */
    int child_proc_number = MAX_CHILD_NUMBER;
    int i, ch;
    pid_t  child_pid;
    pid_t pid[10]={
   0}; /* 存放每个子进程的id */
    if (argc > 1) /* 命令行参数第一个参数表示子进程个数*/
    {
   
        child_proc_number = atoi(argv[1]);
        child_proc_number= (child_proc_number > 10) ? 10 :child_proc_number;

    }

    for (i=0; i<child_proc_number; i++) {
   
        /* 填写代码,建立child_proc_number个子进程要执行
         * 父进程把子进程的id保存到pid[i] */

        pid_t a = fork();
        if(a < 0){
   
            printf("fork error\n");
            exit(-1);
        }
        else if(a == 0){
   
            proc_number = i;
            do_something(); //子进程进行任务
        }
        else{
   
            pid[i] = a;            //存储进程id号
        }

    }
    /* 让用户选择杀死进程,数字表示杀死该进程,q退出 */
    while ((ch = getchar()) != 'q')
    {
   
        if (isdigit(ch))
        {
   
            /*  填写代码,向pid[ch-'0']发信号SIGTERM,
             * 杀死该子进程 */
            kill(pid[ch-'0'],SIGTERM); //向该进程发送kill信号
        }
    }
    /* 在这里写代码,杀死本组的所有进程 */
    for(i=0;i<=proc_number;i++){
   //杀死每个进程
        kill(pid[i],SIGTERM);
    }

    kill(0,SIGTERM);   //杀死主进程
    return 0;
}
void do_something()
{
   
    for(;;)
    {
   
        printf("This is process No.%d and its pid is %d\n",proc_number,  getpid());
        sleep(SLEEP_INTERVAL); // 主动阻塞两秒钟
    }
}
实验过程

先猜想一下这个程序的运行结果。假如运行“./process 20”,输出会是什么样?
答:只生成十个进程,然后不断循环输出,因为代码定义最大进程数为`0个`

运行程序。开另一个终端窗口,运行“ps aux|grep process”命令,看看process 究竟启动了多少个进
程。回到程序执行窗口,按“数字键+回车”尝试杀掉一两个进程,再到另一个窗口看进程状况。按q 退出程序再看进程情况。
答:创建几个进程就有几个进程,杀死一个进程少一个进程,q退出之后进程都没了,见下图。

回答下列问题
你最初认为运行结果会怎么样?
答:和我想到差不多。

实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。
proc_number 这个全局变量在各个子进程里的值相同吗?为什么?
答:不同,因为在创建进程是我设定了值,具体在代码注释。

kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?
答:使用了创建进程数2次,之前一次是杀死子进程,最后一次杀死所有进程。

使用kill 命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退出方式哪种更好一些?
答:杀死进程是使用wait()让主进程等待子进程退出,如果使用kill命令在外部杀死没有在内部杀死好,因为这样进程不是正常结束退出了。生成僵死进程,然后他并不会释放资源

在这里插入图片描述

2. 线程实验

/*  POSIX 下线程控制的实验程序残缺版 */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <pthread.h>

#define MAX_THREAD 3 /* 线程的个数 */
unsigned long long main_counter, counter[MAX_THREAD];
/* unsigned long  long是比long还长的整数 */
void* thread_worker(void*);
int main(int argc,char* argv[])
{
   
    int i, rtn, ch;
    pthread_t pthread_id[MAX_THREAD] = {
   0}; /* 存放线程id*/
    for (i=0; i<MAX_THREAD; i++)
    {
   
        /* 在这里填写代码,用pthread_create建一个普通的线程,
        线程id存入pthread_id[i],线程执行函数是thread_worker
        并i作为参数传递给线程 */
        pthread_create(&pthread_id[i],NULL,thread_worker,(void *)i);
    }
    do
    {
   
    /* 用户按一次回车执行下面的循环体一次。按q退出 */
        unsigned long long sum = 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Randy__Lambert

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值