Linux
, system programming
contributed by < Randy870819
>
ๅฟซ่ฆๅฎๆไฝๆฅญๅฏฆไฝ่ๅฏฆ้ฉๅพๆ็ผ็พๆไบ Makefile
ๆ่ฎๆดๅๅฐๆก้็ผๅฆๆญค้ ๆข๏ผไธ็บไบๅๅฐๆก็ไฟฎๆนๅฏฆ้ฉไน้่ฆไฟฎๆน Makefile
๏ผๅ ๆญคๅฐ Makefile
็ๅๆๆๅๆพๅฐๆญค่๏ผไนๆ่ฌๅๅญธ KYG-yaya573142 ็ๅ
ฑ็ญใ
Makefile ่ชๆณๅจ่ๅธซๆไพ็ Makefile ่ชๆณๅ็คบ็ฏ ๅทฒๆ่ฉณ็ก็ไป็ดน๏ผ lab0/Makefile ใ
ไธ้ๅงๅ ๅฐๅธธ็จๆๆฏๅ้ท็ ่ฎๆธ(ๅทจ้) ๅๅฎ็พฉใ
็ฌฌไธๆฌกๅท่ก make
ๆๅ
่กๅฎ่ฃ Git Hooks:
ๅท่ก make
ๅพ๏ผmake
ๆๅจ makefile ไธญๆพๅฐ็ฌฌไธๅ็ฎๆจ (target) ๏ผไบฆๅณๅฐ all
้ ่จญ็บๆ็ตๅปบๅถ็ฎๆจ๏ผๅ ๆญค้คไบ็ทจ่ญฏ qtest
ๅค๏ผ้ๆๅฎ่ฃ Git Hooks ใ
ๅๆธ่จญๅฎ๏ผ VERBOSE and SANITIZER
make
ไธฆ้ๅ VERBOSE=1
ๆ่ฎ้กฏ็คบ่ฉณ็ดฐ็ทจ่ญฏ็้็จ:
@
ๅ ๅจๆไปคๅ๏ผๆ่ฎๆไปคไธ้กฏ็คบ๏ผๅ ๆญคๅฉ็จ Macro
้ๅ ๅจไนๅพๆๅท่ก็ๆไปคๅ๏ผไพฟ่ฝ่ผๆๆงๅถๆฏๅฆ้กฏ็คบใ@true
่ฝ่ฟฝๅ ่ฉฒ่กๆไปค็ดๆฅ่ขซ่ฆ็บๆๅ็ไฝ็จ๏ผ @printf
ๅๅฏไปฅๅฐๅบ็ธๅฐๆๅญไธฒใmake
ไธฆ้ๅ SANITIZER=1
ๅๆๅฐ็ทจ่ญฏๅๆธๅไฟฎๆนใObjects and Dependencies: ้้ไฝฟ็จไบ Auto-Dependency Generation ไพ่งฃๆฑบ dependency ็ๅ้กใ
deps := $(OBJS:%.o=.%.o.d)
ไฝฟ็จ่ฌ็จๅญๅ
%
้
ไธไนๅๅปบ็ซ็่ฎๆธ๏ผ็บๆๆ objective file ่จญ็ซๅฅฝๅฎ dependency file ็ๆชๅ๏ผไปฅๅไนๅพ include ใdeps
่จญๅฎไธๆจฃ๏ผๆฅไธไพๆ่ฝ้ ๅฉไฝฟ็จใ ( ่จป๏ผๅปบ็ซ dependency file ๆฏ็ทจ่ญฏๅจไธญ pre-processor ็ๅทฅไฝ )็ถไธๅ็ฎๆจ (target) ๆฏๅ ถ่ชๅทฑ็็ธไพ้ ็ฎ (dependency) ๆดๆฐๆ้้่ฆๆฉๆ๏ผไปฃ่กจๅ ถ็ธไพ้ ็ฎๅทฒ่ขซไฟฎๆน๏ผ่ฆ้ๆฐๅปบ็ซ็ฎๆจ๏ผไฝไธๅๅฐๆกๅพๅพๆๆ็พๅค dependency file ๏ผ่ๅไปฅไธๆต็จ๏ผๅฐฑๆฏไปฃๆฟๆๅๅฎๆๅปบ็ซ็ธไพๆง็่ค้ๅทฅไฝ๏ผ
Valgrind ๆฏๆด
valgrind_existence
: ๆชขๆฅไฝๆฅญ็ณป็ตฑๆ็กๅฎ่ฃ Valgrind ใ
man which
which
ๆไปค่ฎไฝฟ็จ่
ๅพ็ฅๆไธ command ๅท่ก็่ทฏๅพใ2>&1
ๅๆฏไปฃ่กจๅฐ stderr
ๅฐๅ
ฅ stdout
ใ (From: Stack Overflow)/dev/null
ๆฏ NULL Device ๏ผๆๅๅ ฑไธๅ
ฅ่ณๆๆฏๅฆๆๅ๏ผไฝฟ็จไปฅไธ่ผธๅ
ฅๅฆๆ้ป่
ฆไธญๅทฒๆๅฎ่ฃ Valgrind ๅๆๅพๅฐ yes
่ผธๅบๅใ
||
ไปฃ่กจ่ฅๅทฆ้ๅท่กๅบ้ฏ๏ผๅฐฑๅท่กๅณ้็ๅ
งๅฎนใvalgrind
$(MAKE)
็บ Recursive make commands ๏ผๆไปฅ่ฆๅฐๅฟไธ่ฆๅๆฌกๅท่ก make
ๅปบ็ซๅๆจฃ็็ฎๆจ๏ผๆ้ ๆ็ก้่ฟดๅใ Manual$(eval expression)
ๅๆฏๆๅฐๅณ้ expression ๅฑ้ไธฆ็ถไฝ Makefile ๆไปคๅท่กใ Manualsed -i "s/alarm/isnan/g" $(patched_file)
: ๅ
ถไธญ "s/alarm/isnan/g"
ไธฆ้่ทฏๅพ๏ผ่ๆฏ sed
(stream editor) ๆฟๆๅญไธฒ็่ชๆณ๏ผๅจๆญคๆฏๅฐ $(patched_file) ไธญ็ๆๆ็ "alarm" ๆฟๆ็บ "iasnan" ใ็ผ็พๅๅญธ frankchang0125 ่งฃ้็ๆด็บๆธ ๆฅใ
queue.h
๏ผqueue structure็บไบ่ฎ q_insert_tail()
่ท q_size()
ๅท่กๆ้ๅฐ ็ๆ้่ค้ๅบฆ๏ผๅขๅ ไบ่ฎๆธ size
่ tail
ๆๆจไพฟๆผๅญๅใ
q_new
ๅปบ็ซไธๅๆฐ็ queue_t
็ตๆง๏ผไธฆๅฐๅ
ถๅๅงๅ๏ผ่ฅ malloc()
ๅๅณ NULL ๏ผไปฃ่กจ้
็ฝฎ่จๆถ้ซๅคฑๆ๏ผๅๅณ NULL ใ
q_free
ไธ้ไฝฟๅ
ๅฐๆฒๆ queue ็็นๅฎๆ
ๆณๅ่็๏ผๅจ queue ่ขซๅปบ็ซ็ๆ
ๆณไธ๏ผ่ตฐ่จชๆดๅ linked list ๅฉ็จ pre
ๆๆจๆๅๅไธๅ list element ๅจๅฐๅ
ถๆๅฐ็่จๆถ้ซๅ deallocation ๏ผๆๅพๅๆธ
้ค queue ็ตๆงใ
่ๆ ฎไปฅไธ่ฎๆด:
่ฆ้ป:
list_ele_t *pre
็ scope;while
ๆนๅฏซ็บ for
่ฟดๅ๏ผๆดๅฅฝ้ฑ่ฎไธ็จๅผ็ขผ็ธฎๆธ;NULL
ๆ๏ผ่ฉฒๅฝๅผ็กไฝ็จ๏ผๆผๆฏๅฐฑๅฏๅฉ็จๆญค็นๆงๆธๅฐไธๅ if
ๆ่ฟฐ;q_insert_head
ไธ้ไฝฟๅ
ๅฐๆฒๆ queue ็็นๅฎๆ
ๆณๅ่็๏ผๅไพๅบๆฐๅข list_ele_t
่ๅญไธฒ๏ผ่ฆๆณจๆ็ๆฏๅฆๆๅ
ถไธญๆไธ็ฐ็ฏๅบ้ฏ๏ผๅฟ
้ ๅฐๅจ้ๅฝๅผไธญๆฐๅข็่จๆถ้ซไฝ็ฝฎ้ฝ้ๆพๆใ
ๆฅไธไพไฝฟ็จ strncpy()
ๅฐ่ผธๅ
ฅๅญไธฒ่ค่ฃฝๅฐๆฐๅข็ๅญไธฒไธญ๏ผ่ฆๆณจๆ็ๆฏ strncpy()
ๅชๆ่ค่ฃฝๆๅฎ้ทๅบฆ ๅๅญๅ
๏ผๅฟ
้ ่ช่กๆณจๆๅญไธฒ็ตๅฐพๆๆฒๆ null character ('\0')
๏ผ
The
strncpy()
function is similar, except that at most n bytes of src are copied. Warning: If there is no null byte among the first n bytes of src, the string placed in dest will not be null-terminated. Linux man page
ๆๅพๆๅ ฅๅฐ้ ญ็ซฏๅพ่ฆ็นๅฅๆณจๆ linked list ้ทๅบฆ็ฑ 0 ่ฎ 1 ็ๆ ๆณ๏ผๆญคๆ้ ญ่ๅฐพ็ซฏๆฏๆๅๅไธๅ list node ใ
q_insert_tail
ๆญคๅฏฆๅ่ท q_insert_head()
ๅนพไนไธ่ด๏ผๆๅพๆๅ
ฅๅฐๅฐพ็ซฏๅพไน่ฆ็นๅฅๆณจๆ linked list ้ทๅบฆ็ฑ 0 ่ฎ 1 ็ๆ
ๆณ๏ผๆญคๆ้ ญ่ๅฐพ็ซฏๆฏๆๅๅไธๅ list node ใ
q_remove_head
ๅ่็ๅฎๆฒๆ queue ๆๆฏ queue ็บ็ฉบ็ๆ
ๆณๅพ๏ผไพฟ่ฝไฝฟ็จ strncpy()
่ค่ฃฝ๏ผไธฆๅจๅญไธฒๅฐพ็ซฏๅ ไธ null character ('\0')
ใ
ๆฅไธไพ็งป้ค้ ญ็ซฏ list node ่ฆๆณจๆๅฟ
้ ็ขบๅฏฆๅฐ้
็ฝฎๅจ่ฉฒ list node ไธ็่จๆถ้ซๆธ
้ค๏ผไบฆๅณๆธ
้คๅฎๅญไธฒๅพ๏ผๅๅฐ list node ๆธ
้ค๏ผๆๅพๅจๆดๆฐ list size ๆไน่ฆๆณจๆ็ถ linked list ้ทๅบฆ็ฑ 1 ่ฎ 0 ๏ผๆๅ่ฆๅฐ queue ไธญ้ ญ็ซฏ่ๅฐพ็ซฏ็ๆๆจๆดๆฐ็บ NULL
๏ผ้ฟๅ
ไนๅพๅๅญๅๅทฒๆธ
้ค็่จๆถ้ซ้ ๆ Segmentation fault ใ
q_size
ๆชขๆฅๅฎ queue ๅฐๆช่ขซๅปบ็ซ็ๆ ๆณๅพ๏ผไพฟ็ดๆฅๅๅณ size ใ
ๅฏๆนๅฏซ็บไปฅไธ:
็ฐกๆฝๅๆธ
ๆฐ๏ผ
q_reverse
ไธ้ไฝฟๅ
ๅฐๆฒๆ queue ๆๆฏ linked list ๅ
งๅชๆไธ็ญ่ณๆ็็นๅฎๆ
ๆณๅ่็ใ
ๅๅฉ็จไปฅไธ3ๅๆๆจๆ็บ่ตฐ่จช linked list ไธฆๅ่ฝๅ
ถ้ฃ็ตๆนๅ๏ผ
ๅฉ็จไปฅไธ 3 ๅๆๆจ๏ผๅจ่ตฐ่จช linked list ไพๅบๅนณ็งปไธฆๅฐ linked list ๅ่ฝใ
TODO: ็จ for
ๆนๅฏซไธฆ็ธฎๆธ scope
q_sort
q_sort
: Top level interface.q_sort()
็บๆๅบ็ Top level interface ๏ผ้คไบๆชขๆฅๆฒๆ queue ๆๆฏ้ทๅบฆ็บ 1 ไธ้่ฆๆๅบ็ๆ
ๆณ๏ผไพฟ้ฒๅฐ Merge sort ๆๅบ๏ผไฝๆๅบๅพๆๅคฑๅป linked list ๅฐพ็ซฏ็่ณ่จ๏ผๅ ๆญค้่ฆ้ๆฐ่ตฐ่จช linked list ๆพๅๅฐพ็ซฏๆๆจใmerge_sort
: Recursive merge sort (Divide and Conquer).merge
: Merge 2 linked list according to natural ordering.list_ele_t
็ๆๆจ head
ๆๅ NULL ๏ผ ๅๅฆๅคไฝฟ็จไธๅ double pointer (pointer to pointer) cursor
ไพ่จไธ็ฎๅๅไฝต linked list ้ฒ่กๅฐ็ไฝ็ฝฎ๏ผๆฅไธไพไพฟ่ฝ่ตฐ่จชๅ
ฉๅ linked list ๏ผไพๆๅฎ็พฉๅฅฝ็ ordering ๅๅไฝต๏ผๅฉ็จ cursor
ๆดๆฐ็ฎๅๅฐพ็ซฏ็ list element ็ๆๆจ๏ผๆๅพ็ถๆไธๅ list ๅทฒ็ถ่ตฐๅฎ๏ผๅ ็บๅ
ฉๅ linked list ๆฉๅทฒๅๅฎๆๅบ๏ผไพฟ่ฝ็ดๆฅๅฆไธๅ list ้ๅ ๅฐๅฐพ็ซฏ๏ผ็ตๆๅไฝต๏ผๅๅๅณๅไฝตๅพ็้ ญ็ซฏๆๆจใstr_cmp
:null character ('\0')
็ๆ
ๆณใq_sort()
(2/23)ไธ้ๅง็ๅฎ Linked List Sort ็ไป็ดนๅ
ถไธญ็ๅ็ไพฟ่ๆ้ๅงๅฏฆ็พๆฒๆ้่ฟดๅผๅซ็ merge sort ๏ผไฝฟ็จ Bottom-up ็ๆนๅผ๏ผ for ่ฟดๅ็ฌฌไธๆฌก iteration ็บๆฏๅ้ทๅบฆ็บ 2 ็ sub-list ๅฎๆๆๅบ๏ผ็ฌฌไบๆฌก iteration ็บๆฏๅ้ทๅบฆ็บ 4 ็ sub-list ๅฎๆๆๅบ๏ผไพๆญค้กๆจ (ๅณ for ่ฟดๅไธญ k*=2
)ใ
From: Linked List Sort
ไฝๆฏ่งๅฏไปฅไธ็จๅผ็ขผไพฟๆ็ผ็พๅจๆๅบๅฐ่ฑกๆฏ linked list ่้ไธ่ฌ้ฃๅ็ๆๅ๏ผๆๅจๆพๅฐๅทฆๅณ่ฆๅไฝต็ partition ไธญ่ฑๅพๅคง็ๅๅคซ๏ผไธฆไธๆๅบ็ๆ็ๆจน็ๅๅฝขๆๅฆๅไธๅ่ฌ็บไธๆฃตไธๅนณ่กก็ๆจน๏ผๅจๆ้่ค้ๅบฆไธๆๅคไธไบ lower order ็้ ๆฌก๏ผ่ไธ็จๅผ็ขผ้ๆฏ่ผ่ค้ (ๆฌ่บซๅๅไธ่ถณไนๆ้ไฟ QQ )ใ
ๅ ๆญคๆๅพ้ๆฏๅฅฝๅฅฝ็ๅฉ็จ้่ฟด๏ผๅฐ merge sort ไพๅ้จๅ่ฝๅฏฆ็พใ
ๆก็จ Natural Sort ไพ็บๅญไธฒ้ฒ่กๆๅบ (้ฃ็ตๅ งๅทฒๆ่ฉณ็ดฐๆ่ฟฐ) ใ
ๅฐ strnatcmp.c ่ strnatcmp.h ๅ ๅ ฅๅฐๆกใ
ไฟฎๆน Makefile ๏ผๅ ๅ
ฅ strnatcmp.o
้ฒ $(OBJS)
ไปฅไพฟๅฐๆกๅปบๅถใ
ๆฅไธไพๅฐฑๅฏไปฅๅจๅฐๆกไธญ็ queue.c
ๅผ็จ strnatcmp.h
ไธฆไฝฟ็จๅ
ถๅฝๆธๅ๏ผๆ่ถฃ็ๆฏๅจ strnatcmp.c
ไธญๆๅ
ฉ็จฎๆฏ่ผ Natural ordering ็ๅฝๅผๅๅฅ็บ strnatcmp()
่ strnatcasecmp()
๏ผๆทฑๅ
ฅๅป็ๅฏไปฅ็ผ็พ strnatcasecmp()
ๅ
ถๅฏฆๆฏๆๅญๅ
่ฝๆ็บๅคงๅฏซ (uppercase) ๅพๅๅๆฏ่ผ๏ผๅ ๆญคๅๆฏๅบ็ท _
้ๅๅธธ็จๅจๆชๅ็ๅญๅ
่ไธ่ฌ่ฑๆๅญๆฏๆฏ่ผ๏ผๅชๅ
ๅบฆๅฐฑๆไฝ๏ผๅจ้้ๆๅๅฐฑๆก็จ strnatcasecmp()
ใ
ๆฅไธไพๆๅๅฏไปฅ็บ Natural Sort ่ฃกๆไพ็ๆธฌ่ณๅตๅปบๆฐ็ๆธฌ่ณๆชๆกไธฆๅจ driver.py
ไธญๅ ๅ
ฅ็ธๅฐๆ็ๆชๅ่ๅๆธ็ญใ
ๅฆๅค่ฆๆณจๆๆๆธฌ่ณๆชๅพ๏ผ้ๅฟ
้ ่ฆไฟฎๆน qtest.c
ไธญ็บ sorting ็ตๆๅๆชขๆฅ็้จไปฝ๏ผๅ ็บไธ้ๅงๆฏไฝฟ็จ strcasecmp()
่้ strnatcasecmp()
ใ
ๆๅพไพฟ่ฝ้ ๅฉไฝฟ็จ Natural sort ๅๆธฌ่ฉฆใ
ไฝๆฏ็ฎๅ้ๆฏๆไธๅๅ้กๆช่งฃๆฑบ๏ผๅฐฑๆฏๆก็จ Natural Sort ๅพๆ่ฎๆธฌ่ฉฆ้
็ฎ็ทจ่ 15 trace-15-perf
TLE ๏ผๅป้คๆไธ่ฌๅญๅ
ๆฏ่ผ็้จไปฝ๏ผๅฏ่ฝ็ๅๅ ๆฏๅๅฎไธ่ฌๅญๅ
prefix ๆชขๆฅๅพ๏ผไพฟ้ ่ฆๅฐๅฉ้ค็ๆธๅญๅญไธฒ (digits) ๅๅคงๅฐ็ๆฏ่ผ๏ผๅ ๆญคๆญค่ไนๆฏไนๅพๅฏไปฅๅ ๅผท็้จไปฝใ
TODO:
็ ็ฉถๆฏๅฆ่ฝๅๆๅ Natural Sort ็ๆ็ใ
ไฝฟ็จไปฅไธๆไปค้็จ Valgrind ๆพๅฐๅบ้ฏ็ๅฐๆน๏ผๅฐ็ฌฌ3็ญๆธฌ่ณ trace-03-ops ๆ้ๅฐ๏ผ
ๅ่ฟฝ่ณ q_reverse()
็ผ็พๆฏๅจๅ่ฝ linked list ๆๅพ้ๆๅปๅฐๅฐพ็ซฏ็ฏ้ป็ๆๆจ next ๆๆๅ NULL
ๆๅป้ๅปๅญๅ้ ๆ Segmentation fault ใ
็ถ้ไบๅพฎไฟฎๆน่งฃๆฑบ่จๆถ้ซๅญๅ็ๅ้กใ
TODO: ็จ diff (HackMD ๆฏๆด่ฉฒ่ชๆณๆจ็คบ) ไพๅฑ็พ็จๅผ็ขผไน้็ๅทฎ็ฐ
้ๅ stack flag ่งๅฏ merge sort!?
XOR Linked List: ๅฉ็จ exclusive or ็็นๆง๏ผๆๅๅฏไปฅ้ๅฐ็จ single pointer ้คๅญ double pointer ็ๆๆ๏ผ็ผบ้ปๆฏๅฟ ้ ่ฆๆๅพ็ฅๅ ฉๅ็ธ้ฐ็ list node ๆ่ฝ็นผ็บๆจ็ (inferencing) ไนๅพ็ list node ไฝๅใ