Linux操作系统使用及C高级编程

Day1:Linux介绍及环境配置

1、什么是unix 

Unix是一种多用户、多任务、开放的、可移植的操作系统,Unix操作系统的特点包括:分时操作、多用户、多任务、多处理器、网络支持、可移植性等,另外,Unix也是许多其他操作系统的基础。


2、什么是Linux

Linux是一个基于Unix设计的类Unix操作系统,它继承了Unix的许多特性和设计思想,比如多用户、多任务、分时操作等,Linux在Unix的基础上进行了许多改进和创新,比如使用开源软件等。

Day2:软件包管理

1、如何在线安装一个软件(假设软件是XXX)

使用sudo apt-get update命令更新软件源信息,然后使用sudo apt-get install XXX安装软件


2、如何离线卸载一个软件并删除其配置文件(假设软件是XXX)

先使用dpkg --list | grep XXX命令查找已安装软件,然后使用sudo apt-get remove XXX命令卸载软件,最后sudo apt-get purge XXX删除软件的配置文件

Day3:linux shell命令(权限、输入输出)

1、从当前用户,切换到超级用户权限的命令是什么

sudo [命令] :命令为需要以超级用户权限执行的命令。


2、a=3; echo ‘$a’和echo "$a"的区别是什么

echo '$a'会直接输出$a,因为单引号中的内容不会被解析,而echo "$a"会输出a的值,所以,执行echo '$a'时,输出的是字符串"$a";而执行echo "$a"时,输出的是变量a的值,即3

Day4:linux shell命令(文件搜索、文件处理、压缩解压)

1、在/etc目录下查找passwd文件是否存在的命令是什么?

使用命令find /etc -name "passwd",如果文件存在,则会输出它们的路径。


2、在/etc/passwd文件中,查找是否有linux这个字符串的命令是什么?

使用命令 grep "linux" /etc/passwd,该命令会在/etc/passwd文件中查找包含"linux"字符串的行,并输出该行内容。


3、如何用tar命令,把file1、file2、file3共3个文件,归档到file.tar中?

使用命令 tar -cf file.tar file1 file2 file3,其中,-c选项表示创建归档文件,-f选项表示指定归档文件名,file1、file2、file3是要打包的文件名而file.tar为归档目标文件名。

Day5:linux shell命令(进程管理、用户管理)

1、查看进程对的方式有哪些?

ps命令:用于显示当前进程的状态信息。
top命令:用于实时显示系统中各个进程的资源占用情况。
pstree命令:以树状图的方式展现进程之间的派生关系,显示效果比较直观。
pgrep命令:用于查找符合条件的进程的进程号。


2、添加用户和删除用户所用的命令是什么?

添加用户:使用adduser或useradd命令可以添加用户。两个命令的区别在于adduser命令会在添加用户时自动创建用户的家目录和一些默认配置,而useradd命令则需要手动指定这些内容。例如:

sudo adduser newuser 和 sudo useradd -m -s /bin/bash newuser

上述命令分别使用adduser和useradd命令添加了一个名为newuser的用户,并创建了用户的家目录和默认shell为bash。

删除用户:使用deluser或userdel命令可以删除用户。两个命令的区别与adduser和useradd类似。例如:

sudo deluser newuser 和 sudo userdel -r newuser

上述命令分别使用deluser和userdel命令删除名为newuser的用户。userdel命令使用-r选项时会连同用户的家目录一起删除。

Day6:linux shell脚本编程(概念、变量、语句)

1、定义两个变量保存整数,并把它们相乘的结果打印出来

Linux操作系统使用及C高级编程_第1张图片

Day7:linux shell脚本编程(概念、变量、语句)

1、将当前目录下的普通文件,归档到hello.tar中

#!/bin/bash

flist=`ls`
for file in $flist
do
if [ -f $file ]
	then
	tarlist="$tarlist $file"
fi
done
 
tar -cvf hello.tar $tarlist


2、计算下5!(5的阶乘)的结果,并打印出来

Linux操作系统使用及C高级编程_第2张图片

 Day8:linux shell脚本编程(函数)

1、将当前目录下的普通文件,归档到hello.tar中,把以上功能封装到一个函数中;

#!/bin/bash

function fun {
flist=`ls`
for file in $flist
do
if [ -f $file ]
	then
	tarlist="$tarlist $file"
fi
done
 
tar -cvf hello.tar $tarlist
}

fun

2、计算下5!(5的阶乘)的结果,并打印出来,把以上功能封装到一个函数中;

Linux操作系统使用及C高级编程_第3张图片

 Day9:Linux TFTP服务搭建及使用

1、TFTP服务搭建过程

安装TFTP服务:
1.测试网络: ping 网站
2.更新软件源:sudo apt-get update
3.安装tftp服务:sudo apt-get install tftpd-hpa tftp-hpa
4.配置服务器:sudo vi /etc/default/tftpd-hpa
5.如果想自己配置一个工作文件夹:修改配置文件中的TFTP_DIRECTORY为你的目标文件夹。
6.配置完成之后,给与目标文件夹权限:chmod 0777 tftpboot/
7.使用该服务传输文件:tftp localhost
8.当使用服务传输文件出错时检查是否未重启该服务:sudo service tftpd-hpa restart
9.下载文件使用get file名
10.上传文件使用put file名
如果出现transfer timed out,有可能是tftpd服务没有启动,解决办法是启动服务
如果出现tftp Permission denied,有可能是权限不足。

 Day10:Linux NFS服务搭建及使用

1、NFS服务搭建过程

搭建NFS服务器
1.安装NFS服务:sudo apt-get install nfs-kernel-server
2.编辑配置文件:sudo vi /etc/exports
添加 /nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
其中nfs/rootfs为共享的目录
3.重启服务:sudo service nfs-kernel-server restart
4.开始挂载目录:sudo mount -t nfs localhost:/nfs/rootfs /mnt
5.取消挂载:sudo umount/mnt

 Day11:C结构体及结构体数组

1、请给以下数组s随心赋值(值的内容自己定,符合C语法标准就可以),并把赋值结果打印出来
struct stu
{
char name[16];
int age;
float score;
}s[3];

#include 
#include 

struct stu
{
	char name[16];
	int age;
	float score;
}s[3];

int main(int argc, const char *argv[])
{
	strcpy (s[0].name,"zs0");
	s[0].age = 20;
	s[0].score = 78;
	printf("name = %s,age = %d,score = %f\n", s[0].name, s[0].age, s[0].score);
	
	strcpy (s[1].name,"zs1");
	s[1].age = 22;
	s[1].score = 88;
	printf("name = %s,age = %d,score = %f\n", s[1].name, s[1].age, s[1].score);
	
	strcpy (s[2].name,"zs2");
	s[2].age = 21;
	s[2].score = 98;
	printf("name = %s,age = %d,score = %f\n", s[2].name, s[2].age, s[2].score);
	return 0;
}

Day12:结构体指针

1、定义一个指针,指向以下数组s,并且通过指针给数组s随心赋值并打印赋值的结果
struct stu
{
char name[16];
int age;
float score;
}s[3];

#include 
#include 

struct stu
{
	char name[16];
	int age;
	float score;
}s[3];

int main(int argc, const char *argv[])
{
	struct stu *p = s;
	strcpy (p->name,"zs0");
	p->age = 20;
	p->score = 78;
	p++;
	
	strcpy (p->name,"zs1");
	p->age = 22;
	p->score = 88;
	p++;
	
	strcpy (p->name,"zs2");
	p->age = 21;
	p->score = 98;

	for (int i = 0; i < 3; i++) {
    	printf("name = %s,age = %d,score = %f\n", s[i].name, s[i].age, s[i].score);
	}
	
	return 0;
}

Day13:结构体嵌套、大小及位域(结构体内存大小的计算方法需要复习)

1、struct s1
{
int a;
char b;
char c;
};
sizeof(struct s1) = 8

2、struct s2
{
char a;
int b;
char c;
};
sizeof(struct s2) = 12

3、struct s3
{
unsigned int a:8;
unsigned int b:16;
unsigned int c:8;
};
sizeof(struct s3) = 4

Day14:C语言共用体和枚举(关于共用体可以查看C语言笔记)

1、union s1
{
int a;
char b;
char c;
};
sizeof(union s1) = 4

2、union s2
{
char a;
int b;
char c;
};
sizeof(union s2) = 4

3、typedef关键的作用是什么,和define有什么区别

​​​​​​​typedef关键字的作用是定义类型的别名,可以方便地为一些类型取更简短、更易懂的名称。而define指令则是用来定义宏,它可以用来定义常量、函数、类型等。它的作用是在代码中引用某个标识符时,将其替换为指定的文本。宏定义不仅可以定义常量,还可以定义函数、类型等,因此具有更大的灵活性。

Day15:内存管理

1、以下代码中,最终打印结果是什么?为什么?

int val = 20;
int main()
{
int val = 30;
printf("%d\n",val);
return 0;
}

程序输出结果为 30。
在程序中,main函数内部定义了一个val变量并赋值30。当程序执行到printf语句时,会输出val变量的值,由于此时作用域内的val变量是main函数内部的,因此输出的结果为30。

Day16:动态内存使用

以下代码有问题吗?如果有,是什么问题,怎么改正。

void getmemory( char *p )
{
 p = (char *) malloc( 100 );
}
 
void test( void )
{
 char *str = null;
 getmemory( str );
 strcpy( str, "hello world" );
 printf( str );
}

在getmemory函数中,p是一个指向char类型的指针,用于存储动态分配内存的地址。在这个函数中,p被分配了内存但是这个分配的内存地址是作为函数 getmemory的局部变量而存在的,离开这个函数后这个地址就会被销毁,而无法被其他函数 test 访问到。
修改之后代码如下:

void getmemory(char **p){
 *p = (char *) malloc( 100 );
}
 
void test(void){
 char *str = NULL;
 getmemory( &str );
 strcpy( str, "hello world" );
 printf( "%s", str );
}

Day17:条件编译

1、两段代码,想编译其中一段,该怎么办?

使用条件编译语句,然后在程序文件中定义宏的形式来选择需要的编译代码, 如:#ifdef 0 代码语句A #else 代码语句B #endif,这段就是执行语句B,另外还有其他几种其他方式,这里就不举例了。
2、gcc编译步骤有哪些?

​​​​​​​GCC的编译流程分为四个步骤:预处理(Pre-Processing)、编译(Compiling)、汇编(Assembling)、链接(Linking)

Day18:GDB调试

1、gdb常用的命令有哪些,是什么功能?(至少列3个)​​​​​​​

1.list 行号 :查看指定位置的程序源代码
2.break 函数名 :在指定函数处设置断点
3.info break : 显示断点信息
4.run :继续运行程序
5.next :单步运行,不进入函数内部
6.continue :继续运行,直到程序结束或者遇到断点

Day19:Makefile用法及变量(自定义变量、自动变量、隐含变量)

1、Make工程管理器是一个“自动编译管理器”,自动体现在哪里?

这里的自动是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,它通过读入Makefile文件的内容来执行大量的编译工作,Make将只编译改动过的代码文件,而不用编译所有文件。
2、Makefile的基本语法规则是什么?

Makefile的基本语法规则:由make工具创建的目标体(target),通常是目标文件或可执行文件、要创建的目标体所依赖的文件(dependency_file)、创建每个目标体时需要运行的命令(command),特别要注意的是:在命令行前面必须是一个“TAB键”,否则编译错误。

Day20:Makefile条件判断及函数使用

有以下代码,编写一个makefile文件来编译它们:

文件fun1.c :
#include
void myprintf1()
{
printf("fun1!\n");
}
文件fun2.c:
#include
void myprintf2()
{
printf("fun2!\n");
}
文件head.h:
void myprintf1();
void myprintf2();
文件fun.c:
#include "head.h"
int main(int argc, const char *argv[])
{
myprintf1();
myprintf2();
return 0;
}
​​​​​​​test:fun1.o fun2.o fun.o
    gcc fun1.o fun2.o fun.o -Wall -O -g -o test
fun1.o:fun1.c
    gcc -c fun1.c -o fun1.o
fun2.o:f2.c
    gcc -c fun2.c -o fun2.o
fun.o:fun.c
    gcc -c fun.c -o fun.o
.PHONTY:clean
clean:
    rm *.o test

​​​​​​​

Day21:make的使用及练习

1、make -f和make -C的区别是什么

​​​​​​​make -f:读入当前目录下的file文件作为Makefile。例如,make -f mymakefile将使用名为mymakefile 的文件作为Makefile文件。
make -C:读入指定目录下的Makefile。例如,make -C mydir将会先切换到名为mydir的目录,然后在该目录下执行Makefile文件。
所以,make -f是指定Makefile文件名称的选项,而make -C是指定要切换到的目录的选项。

你可能感兴趣的:(学习作业,ubuntu,linux)