command + c 復制
command+v 粘貼
command +a 全選
command +s 保存
command +z 撤銷
command +x 剪切
command +space 輸入法的切換
command +<—(退格鍵) 刪除光標所在行,光標前的所有內容
option鍵(ios)--alt(windows)鍵
command在Windows鍵盤中就是windows鍵
cd:change directory 切換目錄
liuzw@Ubuntu:~/sunjie$ cd cliuzw@ubuntu:~/sunjie/c$
cd ~ 或者直接輸入cd,是切換到當前用戶的主目錄
liuzw@ubuntu:~/sunjie/c$ cd liuzw@ubuntu:~$
cd - 撤銷上一次的cd操作
liuzw@ubuntu:~/sunjie$ cd cliuzw@ubuntu:~/sunjie/c$ cd liuzw@ubuntu:~$ cd -/home/liuzw/sunjie/cliuzw@ubuntu:~/sunjie/c$
cd / 回到根目錄
cd .. 回到父目錄
liuzw@ubuntu:~/sunjie/c$ cd ..liuzw@ubuntu:~/sunjie$
liuzw@ubuntu:~/sunjie$ pwd/home/liuzw/sunjie
ls –a(all) 查看所有資源,包括隱藏的
ls –l(list one file per line)
紅色圈住的第一列表示資源類型,其中的d表示目錄,-表示文件
紅色圈住的第二列表示占用磁盤空間大小
mkdir –p 當父目錄不存在時,就創建父目錄,而不是報錯
$? 表示上一次命令的執行結果,0表示執行正確,其他的表示錯誤,如上圖示
拷貝文件
拷貝目錄
cat –n 顯示時加行號
計算機只認識1和0,編程語言的層級如下:
機器語言 | 匯編語言 | 高級語言(c語言) |
1001,0010,0010,1111 | mov 2 f | while if int |
編譯:實質就是翻譯。常用的編譯器如:gcc
可執行文件是運行時環境和一些.o結尾的文件的集合。將我自己目標文件和這些文件鏈接以后,形成可執行的文件。
目標文件是二進制機器碼文件,可執行文件也是二進制的機器碼文件,但是目標文件不能在機器上運行,必須與運行環境等鏈接才可運行。而可執行文件可以在機器上運行。
編寫我的第一個c程序,hello.c他hello.h
hello.h文件內容如下:
#define HELLO "helloworld"
Hello.c文件內容如下
#include <stdio.h>#include "hello.h"int main(void){ printf(HELLO); return 0;}
整個編譯階段分為四步:
第一步:預處理,hello.c轉變為hello.i,一般為隱式執行
預處理命令:gcc -E hello.c -o hello.i,生成預處理文件簡略如下:
extern void flockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 943 "/usr/include/stdio.h" 3 4
# 2 "hello.c" 2
# 1 "hello.h" 1
# 3 "hello.c" 2
int main(void)
{
printf("helloworld");
return 0;
}
在預處理階段,宏HELLO被替換為實際內容
第二步:匯編階段,將C語言文件轉換為匯編語言文件,也就是hello.i轉變為hello.s
命令:gcc -S hello.i -o hello.s
hello.s文件內容如下
.file "hello.c" .section .rodata.LC0: .string "helloworld" .text .globl main .type main, @functionmain:.LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $.LC0, %edi movl $0, %eax call printf movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc.LFE0: .size main, .-main .ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4" .section .note.GNU-stack,"",@progbits
第三步:將匯編語言編譯成對應的機器語言(二進制格式),也就是hello.s轉換為hello.o
命令:
gcc -c hello.s -o hello.o
使用命令
objdump -d hello.o
反匯編hello.o文件內容如下:
hello.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: bf 00 00 00 00 mov $0x0,%edi
9: b8 00 00 00 00 mov $0x0,%eax
e: e8 00 00 00 00 callq 13 <main+0x13>
13: b8 00 00 00 00 mov $0x0,%eax
18: 5d pop %rbp
19: c3 retq
第四步:將hello.o文件與運行環境鏈接,形成可執行文件
命令:
gcc hello.o -o hello
查看hello文件內容,命令objdump –d hello反匯編查看
000000000040052d <main>:
40052d: 55 push %rbp
40052e: 48 89 e5 mov %rsp,%rbp
400531: bf d4 05 40 00 mov $0x4005d4,%edi
400536: b8 00 00 00 00 mov $0x0,%eax
40053b: e8 d0 fe ff ff callq 400410 <printf@plt>
400540: b8 00 00 00 00 mov $0x0,%eax
400545: 5d pop %rbp
400546: c3 retq
400547: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1)
40054e: 00 00
以上為鏈接后的main函數,注意與未鏈接的區別:
0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: bf 00 00 00 00 mov $0x0,%edi
9: b8 00 00 00 00 mov $0x0,%eax
e: e8 00 00 00 00 callq 13 <main+0x13>
13: b8 00 00 00 00 mov $0x0,%eax
18: 5d pop %rbp
19: c3 retq
執行文件,命令./hello
如果把hello.c程序中的return 0 去掉的話,返回值就不一定為0
liuzw@ubuntu:~/sunjie/c$ ./a.out
helloworldliuzw@ubuntu:~/sunjie/c$ echo $?
10
總結:以上所有具體的編譯過程可直接執行如下命令,直接形成可執行文件a.out
,也可加-o hello
新聞熱點
疑難解答