Trong bài trước, chúng ta đã hiểu rằng các chương trình tầng user space gọi xuống kernel space thông qua việc gọi các system call. Bài này sẽ giới thiệu 2 thành phần quan trọng trong lập trình Linux là thư viện tiêu chuẩn C và công cụ biên dịch GCC.
C Standard Library
Thư viện tiêu chuẩn C (C standard library – libc) có thể coi là trái tim của các ứng dụng Linux, bao gồm các hàm tiêu chuẩn từ cơ bản từ mở một file, thao tác string hay đến việc gọi system call xuống Linux kernel.
Rất nhiều hàm thư viện không tạo ra một system call nào như các hàm thao tác string (strcmp, strcpy…), nhưng có nhiều hàm thư viện là một hàm wrapper, trực tiếp gọi một system call. Lý do là các system call được tạo ra để giúp ứng dụng giao tiếp với kernel nên rất nhiều trong số đó có thể không thân thiện với lập trình viên. Đơn cử như hàm printf() để hiển thị một dòng text lên màn hình với các định dạng khác nhau mà tất cả chúng ta đều dùng mà không hề gặp một chút khó khăn. Nhưng để làm được việc này, hàm printf() phải làm thêm các bước: chuyển đổi nội dung text đó sang định dạng mà người dùng mong muốn (ví dụ %d hay %s), rồi dùng system call write() để ghi nội dung đã chuyển đổi đó vào mô tả file của màn hình hiển thị. Tương tự như việc sử dụng hàm malloc() và free() để cấp phát và giải phóng vùng nhớ cho một biến sẽ đơn giản hơn rất nhiều so với việc sử dụng system call brk().
Vì vậy, thư viện C giúp lập trình viên chỉ cần gọi các hàm thân thuộc, thay vì phải hiểu system call nào được gọi hay kernel thực thi system call đó như thế nào.
Thư viện GNU C
C standard library được sử dụng phổ biến nhất hiện nay là GNU C library (glibc). Ngoài ra còn có thư viện khác như uClibC, diet libc với ưu điểm là yêu cầu bộ nhớ nhỏ hơn glibc nên được dùng trong một số thiết bị nhúng.
Để xác định được phiên bản của glibc đang được sử dụng trong hệ thống, chúng ta chạy file thực thi của thư viện glibc như một chương trình, nó sẽ in ra màn hình thông tin của thư viện:
minhlv@ubuntu:~$ /lib/x86_64-linux-gnu/libc.so.6
GNU C Library (Ubuntu GLIBC 2.23-0ubuntu9) stable release version 2.23, by Roland McGrath et al. Copyright (C) 2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Compiled by GNU CC version 5.4.0 20160609. Available extensions: crypt add-on version 2.1 by Michael Glad and others GNU Libidn by Simon Josefsson Native POSIX Threads Library by Ulrich Drepper et al BIND-8.2.3-T5B libc ABIs: UNIQUE IFUNC For bug reporting instructions, please see: <https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>. minhlv@ubuntu:~$ |
Trong một số bản phân phối Linux, thư viện GNU C có thể nằm trên đường dẫn khác thay vì /lib. Bạn có thể tìm đường dẫn chứa thư viện bằng cách chạy lệnh ldd (list dynamic dependencies) với một chương trình bất kỳ được truyền vào như sau:
minhlv@vngeek:~$ ldd /bin/ls | grep libc
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1a129b1000) minhlv@vngeek:~$ |
GCC Compiler
GNU Compiler Collection (GCC) là công cụ biên dịch source code rất phổ biến trong lập trình các hệ thống Linux. GCC ban đầu chỉ được viết để biên dịch source code cho các hệ thống GNU. Phiên bản đầu tiên của GCC chỉ biên dịch được code C, nên còn được gọi là GNU C Compiler. Trải qua các giai đoạn phát triển, GCC đã hỗ trợ biên dịch được thêm ngày càng nhiều ngôn ngữ như C++, Objective-C, Fortran, Ada, Go và do đó về sau GCC được sử dụng để viết tắt cho GNU Compiler Collection.
Thông thường, hệ thống Linux của bạn đã được cài sẵn trình biên dịch gcc và chúng ta chỉ cần sử dụng luôn. Bạn có thể kiểm tra bằng câu lệnh sau:
Kiểm tra đường dẫn gcc:
which gcc
Output:
/usr/bin/gcc
Kiểm tra phiên bản gcc:
gcc --version
Output:
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Nếu máy của bạn chưa cài đặt gcc, thì bạn cũng có thể cài đặt bằng câu lệnh đơn giản sau:
apt-get install gcc
Kết luận
C standard library là công cụ không thể thiếu trong lập trình Linux, cung cấp các hàm phục vụ cho việc viết một ứng dụng Linux và là cầu nối giữa tầng ứng dụng và Linux kernel. Việc này không những tiện lợi cho lập trình viên mà còn giúp bảo vệ kernel và phần cứng. Bên cạnh thư viện GNU, một số thư viện C khác như uclibc, diet C có tính năng và dung lượng nhỏ hơn phù hợp với các hệ thống nhúng Linux có bộ nhớ nhỏ vẫn đang được sử dụng hiện nay. Trong bài tiếp theo, chúng ta sẽ tìm hiểu cách xử lý khi system call và các hàm thư viện trả về kết quả lỗi.