Linux操作系统中基本工具的学习

关于一系列等待要去学的知识

  1.makefile

  2.gdb

  3.shell

  4. C命令行操作

 

MakeFile的简单入门:

  在Linux中创建 makefile 文件只要把文件命名为 makefile 就行了

  

 

 

    这是最简单的makefile中的格式

 

    hello 是目标文件

 

    :后是hello依赖于哪些文件

 

    下面是要实现产生hello文件的命令

 

    

 

  

 

 

 

 

       更好的方式,使用上了变量

   
  当然还有更多的快捷的方式和符号, 目前就学这些吧

 

 《调试理论与实践 (Fault; Failure; Error; 调试一切) [南京大学2023操作系统-P8] (蒋炎岩)》

  

 

   

 

   简单来说:为何debug困难?

  因为我们程序员写的是Fault

  但是在中间经历了 未知个 Error

  最终变成了 Failure,这是我们可以观察到的,但是真正错误可能不是他

 

 

 

 

 

 

 

 

 断言的使用可以使得我们在一些不确定的假设出设置保险

一旦错误,就可以避免Fault 变 Failure 或快速找到 Error

 

 

《gdb的使用》

#include "Semaphore.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
const int N = 1e3;
// 要求:
// 运行多位读者共享资源
// 只运行一位写者在写
// 写者要写之前全部的读者和写者都要退出
// 即读者优先

// mutex用于锁的作用,即使互斥地访问临界区
// writePower用于同步,即决定写在什么时候运行写操作
// mutex要初始化为1,writePower要初始化为1

// 初始化操作的初始值是什么,具体是由Semaphore.h中P()这个函数决定的
// 我设计的P操作是当信息量的值<=0就让其睡眠,而且是在if()语句判断之后在--
Sem_t mutex, writePower;
int readerCnt;
// 假设写者是写书,写者每一次写一本书,即number++;
int number = 0;
void *reader(void *id)
{
    while (1)
    {
        P(&mutex);
        readerCnt++;
        if (readerCnt == 1)
            P(&writePower);
        printf("读者%d 正在读书...\n", *(int *)id);
        V(&mutex);
        // 读书中....用sleep代替
        sleep(1);
        P(&mutex);
        readerCnt--;
        printf("读者%d 读完书了...目前还剩下%d个读者\n", *(int *)id, readerCnt);
        if (readerCnt == 0)
            V(&writePower);
        V(&mutex);
        // sleep在#include <unistd.h>上
        sleep(2);
    }
    return NULL;
}
void *writer(void *id)
{
    while (1)
    {
        P(&writePower);
        printf("写者%d 正在写书\n", *(int *)id);
        number++;
        printf("写者%d 写书完毕,目前有%d本书\n", *(int *)id, number);
        V(&writePower);
        sleep(2);
    }
    return NULL;
}
// argc是描述参数的个数
// argv是参数的集合
int main(int argc, char *argv[])
{
    init(&mutex, 1), init(&writePower, 1);
    readerCnt = 0;
    int readId[N], writeId[N];
    pthread_t readPerson[N], writerPerson[N];
    for (int i = 1; i <= atoi(argv[1]); i++)
    {
        readId[i] = i;
        Pthread_create(&readPerson[i], NULL, reader, (void *)&readId[i]);
    }
    for (int i = 1; i <= atoi(argv[2]); i++)
    {
        writeId[i] = i;
        Pthread_create(&writerPerson[i], NULL, writer, (void *)&writeId[i]);
    }
    // 将下面的代码注释掉后发现一main线程完成,那么上面的全部程序也就结束了?(不太确定)
    // 总之,终端上程序会结束
    for (int i = 1; i <= atoi(argv[2]); i++)
        Pthread_join(writerPerson[i], NULL);
    for (int i = 1; i <= atoi(argv[1]); i++)
        Pthread_join(readPerson[i], NULL);
    return 0;
}

  以调试如上程序为例:

    

 

 

   注意-g一定不能忘记了

   打断点如 b 60

  即在代码的第60行打断点:

 

 

    这里我想要给main函数传参,如何做到?

  即 r 5 3

  表示运行程序 后面是跟的参数

  然后程序停到打的断点处

 

 

关于int main( int argc, char* argv[] ) 中arg和argv参数的解析

  博客

 

posted @ 2023-02-26 19:18  次林梦叶  阅读(37)  评论(0)    收藏  举报