1.在虚拟机中安装ubuntu
2.右键打开终端
首先安装vim
sudo apt-get update
sudo apt-get install vim
cc -v //检查当前编译器版本,可看到使用的是gcc版本
gcc -v
cd ~ //到根目录
pwd //查看当前所在位置
ls //当前目录下包含哪些文件夹或文件, 可回到桌面打开查看文件夹
ls -l //可显示详细信息,开头是'-'即为文件,是'd'即为文件夹
touch abcd //创建文件
rm abcd //删除文件
mkdir workspace //创建目录
cd workspace
pwd
mkdir lesson1
cd lesson1
touch a.c
vim(或vi) a.c
vim的使用:
按i:在当前光标前插入一个字符
按a:在当前光标后插入一个字符
shift+a 在行尾插入
shift+i 在行首插入
o 下一行插入
shift+o 当前行上一行插入
dd 删除整行
x 删除一个字符
esc 进入命令模式
:w 按enter,进行保存
:q 退出vim
首先使用vim编辑a.c
#include <stdio.h>
int main(void){
printf("hello world\n");
return 0;
}
:wq
cc a.c(这里写的是cc,其实是gcc)
ls // a.c a.out 默认输出了一个文件a.out
ls -l
// -rw-r--r-- fro(当前用户名) fro(当前所属用户组) xxxxxx a.c
// -rwxr-xr-x fro(当前用户名) fro(当前所属用户组) xxxxxx a.out 这个有x,代表可执行
./a.out //执行
// 为什么出现3次rwx?Linux系统可能有多个用户都在使用,不同用户拥有不同权限
//第一个表示当前创建这个文件的用户可读可写可执行
//第二个表示同一个用户组的用户,第三个表示不是当前用户或用户组的任意用户
// rwx分别表示可读可写可执行
编写多个文件
首先 cd ..
mkdir lesson2
cd lesson2
vi hello.c
:sp second.c //新建一个文件,并进入second.c
esc后 ctrl+w+down //进入下面的hello.c
:set nu 打开行号
剪切hello.c
光标移动到想要剪切的行
输入 行数+dd //这样就剪切了
粘贴: ctrl+w+up 进入second.c, 按p
:wqa //a表示all ,把所有文件都保存并退出
gcc hello.c second.c -o main.out
./main.out
gcc -c max.c -o max.o //只编译,不连接
gcc -c min.c -o min.o
gcc max.o min.o hello.c //这样比较快,使用编译好的.o,就不用再重新编译
cat hello.c //可以查看
cat min.o //一堆乱码
rm *.o //删掉所有的.o文件
make命令
make工具可以将大型的开发项目分成若干个模块,清晰快捷地整理源文件
make内部也是用的gcc
make -v //先检查有没有装make
sudo apt-get install make //安装make
vi Makefile
注意Makefile文件里的tab必须是6个空格,如果是4个空格(很多windows下ide会设为4个空格),会通不过
make
ls
mkdir lesson3
cd lesson3
vi main.c
gcc main.c -o main.out && ./main.out
//linux中多个命令可用&&,条件是前一个命令return 0;如果return 其他数字,不会执行后一条指令
echo $? //0
//linux下,执行完一条命令后,可以输入 echo $?,如果输出0,就说明程序是正常执行的,如果输出其他数字,说明失败了
下面看main的参数
cp main.c main2.c
vi main2.c
gcc main2.c -o m2.out
ls
./m2.out -l -aaa
//argv[0] is ./m2.out
//argv[1] is -l
//argv[2] is -aaa
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
for(i=0;i<argc;i++){ //如果把int i写在for循环里,98是不支持的,会报错
printf("argv[%d] is %s\n",i,argv[i]);
}
return 0;
}
Linux的标准输入流、标准输出流、标准错误流
stdin //标准输入流默认情况下是键盘
stdout
//也是一个文件,比如切换到网卡,就可以向网卡写入数据
//切换到打印机,就可以向打印机写入数据
//默认是显示器
//
stderr
#include <stdio.h>
int main(void)
{
fprintf(stdout,"please enter an integer(>2)\n");
//向显示器输出,相当于 printf(stdout,"please ...");
int a;
fscanf(stdin,"%d",&a);
if(a<2){
fprinf(stderr,"wrong\n");
return 1; //注意这里,标准错误流的返回值不能为0
}
return 0;
}
./a.out
//0
//wrong
输入流输出流以及错误流的重定向
//标准输入流是0,标准输出流是1,如果不写就是默认的
./a.out 1>> a.txt //重定向到a.txt
cat a.txt
ls /etc
ls /etc >> etc.txt //重定向到etc.txt
cat etc.txt
ls /etc > etc.txt //如果是单箭头,每次都是新的内容,如果是双箭头,就追加新的内容
以上是输出流的重定向,以下输入流的重定向
vi input.txt //4
./a.out < input.txt //注意箭头方向
错误流的重定向
./a.out 1>t.txt 2>f.txt //正确的输入到t.txt,错误的输入到f.txt
管道:把多个程序结合起来
ls /etc/ | grep ab
//前一个命令的输出作为后一个命令的输入
//列出etc下文件名中包含ab的文件
ps -e //查看进程
ps -e | grep ssh //如果有,说明已经启动了ssh服务,可以通过终端远程连接我们这个操作系统
./input.out | ./avg.out