Linux操作系统中基本工具的学习
关于一系列等待要去学的知识
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参数的解析