The Linux Programming Interface Chương 1 · History and Standards

Chương 1 · Lịch sử và chuẩn Chapter 1 · History and Standards

Linux là một thành viên của gia đình UNIX — một lịch sử và một bộ chuẩn Linux từ đâu mà ra, và vì sao cần “luật chơi chung” Linux is a member of the UNIX family — a history and a set of standards

Chương mở đầu không dạy một lời gọi hệ thống nào; nó trả lời hai câu hỏi “vì sao”. Michael Kerrisk bắt đầu bằng một câu gọn: Linux là một thành viên của gia đình hệ điều hành UNIX, và trong giới máy tính, UNIX có một lịch sử dài.1 Nửa đầu chương kể lịch sử đó — nguồn gốc UNIX, ngôn ngữ C, rồi hai dòng chảy dẫn tới Linux: dự án GNU và nhân (kernel) Linux. Nửa sau giải thích vì sao có các chuẩn ràng buộc cách ta lập trình.1

Chương này chưa dạy viết chương trình. Nó kể hai chuyện: Linux ra đời thế nào, và vì sao người ta cần đặt ra “luật chơi chung” (gọi là chuẩn) để các chương trình chạy được trên nhiều máy khác nhau. Hiểu được gốc rễ thì những chương sau mới dễ ngấm. Nhớ nhé: biết gốc gác và luật chơi trước, rồi mới học cách ra lệnh cho máy.

The opening chapter teaches no system call; it answers two “why” questions. Michael Kerrisk begins plainly: Linux is a member of the UNIX family of operating systems, and in computing terms UNIX has a long history.1 The first half tells that history — the origins of UNIX, the C language, then the two currents that led to Linux: the GNU project and the Linux kernel. The second half explains why there are standards that constrain how we program.1

Kerrisk nêu rõ một đặc điểm đáng chú ý của UNIX: sự phát triển của nó không do một hãng hay tổ chức đơn lẻ kiểm soát; nhiều nhóm — cả thương mại lẫn phi thương mại — cùng đóng góp. Điều đó khiến UNIX giàu tính năng, nhưng cũng khiến các bản hiện thực (implementation) phân nhánh (diverge) theo thời gian, làm việc viết ứng dụng chạy được trên mọi bản UNIX ngày càng khó. Chính sức ép đó sinh ra phong trào chuẩn hoá — mạch chính của nửa sau chương.1

Luận đề của chương: Linux không phải một phát minh đơn độc mà là điểm hội tụ của hơn hai mươi năm lịch sử UNIX và ngôn ngữ C; và vì UNIX phát triển phân tán, nó buộc phải được chuẩn hoá (C, POSIX, Single UNIX Specification) để tính khả chuyển (portability) — viết một lần, dịch và chạy được ở nơi khác — trở thành hiện thực.1

Ý chính: Linux là con cháu của UNIX; vì UNIX bị chia thành nhiều phiên bản khác nhau, người ta phải đặt ra chuẩn để chương trình viết ở máy này còn chạy được ở máy kia. Nhớ nhé: lịch sử giải thích Linux là gì, còn chuẩn giải thích vì sao mã của bạn chạy được nhiều nơi.

The chapter's thesis: Linux is not a lone invention but the convergence of more than twenty years of UNIX and C history; and because UNIX grew in a decentralized way, it had to be standardized (C, POSIX, the Single UNIX Specification) so that portability — write once, compile and run elsewhere — could become real.1

Cụm khái niệm 01 Concept cluster 01

Nguồn gốc UNIX và ngôn ngữ C — hai thứ sinh ra cùng nhau UNIX ra đời thế nào, và ngôn ngữ C đi cùng nó The origins of UNIX and C — born together

Bản hiện thực UNIX đầu tiên được Ken Thompson viết năm 1969 tại Bell Laboratories — một bộ phận của hãng điện thoại AT&T — bằng hợp ngữ trên máy tính mini Digital PDP-7 (cùng năm Linus Torvalds ra đời).1 Cái tên UNIX là một lối chơi chữ nhại lại MULTICS, dự án hệ điều hành trước đó. Từ MULTICS, Thompson mang theo ba ý tưởng còn sống tới nay: hệ thống tệp dạng cây, một chương trình riêng để thông dịch lệnh (shell), và quan niệm tệp là dòng byte không cấu trúc.1

Năm 1969, một người tên Ken Thompson viết hệ điều hành UNIX đầu tiên ở phòng thí nghiệm Bell (thuộc hãng điện thoại AT&T), trên một máy tính cổ. Từ dự án cũ tên MULTICS, ông giữ lại vài ý hay: sắp xếp tệp theo dạng cây thư mục, dùng một chương trình riêng để gõ lệnh (shell), và coi mọi tệp chỉ là một chuỗi byte. Nhớ nhé: UNIX bắt đầu từ một người, một máy cũ, năm 1969.

The first UNIX implementation was written by Ken Thompson in 1969 at Bell Laboratories — a division of the telephone company AT&T — in assembler on a Digital PDP-7 minicomputer (the same year Linus Torvalds was born).1 The name UNIX was a pun on MULTICS, an earlier operating-system project. From MULTICS, Thompson carried three ideas still with us: a tree-structured file system, a separate program for interpreting commands (the shell), and the notion of files as unstructured streams of bytes.1

Định nghĩa. Ngôn ngữ C do Dennis Ritchie — một đồng nghiệp của Thompson ở Bell Labs — thiết kế và hiện thực đầu thập niên 1970. C là hậu duệ của ngôn ngữ B (do Thompson viết), vốn rút nhiều ý từ ngôn ngữ cũ hơn là BCPL. Đến năm 1973, C đã đủ chín để gần như toàn bộ nhân UNIX được viết lại bằng nó — khiến UNIX thành một trong những hệ điều hành đầu tiên viết bằng ngôn ngữ bậc cao, nhờ đó dễ chuyển (port) sang kiến trúc phần cứng khác.1

Nói đơn giản. C là một ngôn ngữ lập trình do Dennis Ritchie tạo ra, sinh ra để viết chính UNIX. Vì viết bằng C (ngôn ngữ dễ đọc) thay vì mã máy, UNIX dễ mang sang máy khác. Nhớ nhé: C sinh ra để viết UNIX, và điều đó khiến UNIX đi được khắp nơi.

Definition. The C language was designed and implemented by Dennis Ritchie — a colleague of Thompson's at Bell Labs — in the early 1970s. C descends from the B language (written by Thompson), which drew many ideas from the still-earlier BCPL. By 1973, C had matured enough that the UNIX kernel could be almost entirely rewritten in it — making UNIX one of the earliest operating systems written in a high-level language, and therefore portable to other hardware architectures.1

1969 UNIX (PDP-7, hợp ngữ)
1971 First Edition
1973 nhân viết lại bằng C; có pipe
1979 3BSD (Berkeley)
1983 System V · 4.2BSD (sockets)

1969 → UNIX ra đời
1973 → viết lại bằng C
1983 → chia hai nhánh lớn:
  BSD và System V

1969 UNIX (PDP-7, assembler)
1971 First Edition
1973 kernel rewritten in C; pipes
1979 3BSD (Berkeley)
1983 System V · 4.2BSD (sockets)

  1. editions

    Các “edition” — UNIX lan ra khỏi AT&T Các bản UNIX đầu tiên và việc lan rộng The editions — UNIX spreads beyond AT&T

    Từ 1969 tới 1979, UNIX ra đời theo các bản gọi là edition — ảnh chụp bản phát triển ở AT&T. First Edition (11/1971) đã chạy trên PDP-11; Third Edition (2/1973) có trình biên dịch C và lần đầu hiện thực pipe (đường ống); Sixth Edition (5/1975) là bản đầu tiên được dùng rộng rãi bên ngoài AT&T.1 Do bị luật chống độc quyền ràng buộc, AT&T không bán được UNIX như một sản phẩm, nên cấp phép cho các trường đại học với phí danh nghĩa, kèm mã nguồn.1

    UNIX phát hành theo từng “bản” (edition). Bản thứ ba (1973) đã có trình dịch C và đường ống (pipe — nối đầu ra lệnh này vào đầu vào lệnh kia). Vì luật không cho AT&T bán UNIX, họ đưa nó cho các trường đại học với giá rẻ, kèm cả mã nguồn, nên nó lan rất nhanh. Nhớ nhé: UNIX nổi lên nhờ được chia cho các trường học, kèm mã nguồn.

    From 1969 to 1979, UNIX was released as editions — snapshots of the development version at AT&T. The First Edition (Nov 1971) already ran on the PDP-11; the Third Edition (Feb 1973) included a C compiler and the first implementation of pipes; the Sixth Edition (May 1975) was the first to be widely used outside AT&T.1 Bound by antitrust terms, AT&T could not sell UNIX as a product, so it licensed the system to universities for a nominal fee, with source code.1

    Bạn gặp nó ở đâuWhere you meet it Mỗi khi bạn gõ ls | grep foo trong shell, bạn đang dùng đúng cơ chế pipe xuất hiện lần đầu ở Third Edition năm 1973.1 Khi bạn nối hai lệnh bằng dấu “|” trong terminal, đó là ý tưởng pipe từ năm 1973. Every time you type ls | grep foo in a shell, you use the very pipe mechanism that first appeared in the Third Edition in 1973.1

    Con số lan toả

    Đến năm 1977, UNIX đã chạy ở khoảng 500 nơi, trong đó có 125 trường đại học tại Hoa Kỳ và vài nước khác — một hệ điều hành đa người dùng tương tác vừa rẻ vừa mạnh ở thời mà phần mềm thương mại rất đắt.1

    Vì sao mã nguồn quan trọng

    Bản phân phối cho trường học kèm mã nguồn nhân (khoảng 10.000 dòng khi đó), cho sinh viên đọc, sửa và học từ một hệ điều hành thật — nền tảng tạo ra một thế hệ “tín đồ” UNIX.1

  2. BSD vs System V

    BSD và System V — hai nhánh lớn phân ra UNIX tách thành hai nhánh chính BSD and System V — two great branches

    Từ Seventh Edition (1979), UNIX rẽ thành hai biến thể quan trọng. Ở Đại học California, Berkeley, Bill Joy và nhiều nghiên cứu sinh phát triển BSD (Berkeley Software Distribution); bản phân phối đầy đủ đầu tiên là 3BSD (12/1979), và 4.2BSD (1983) chứa một hiện thực TCP/IP hoàn chỉnh cùng sockets API.1 Nhánh kia, sau khi AT&T được phép bán UNIX, là System V (1983), với bản định hình SVR4 (System V Release 4) năm 1989 hợp nhất nhiều tính năng từ BSD, kể cả mạng.1

    UNIX chia thành hai dòng. Một dòng do trường Berkeley phát triển, gọi là BSD — chính nó đem mạng Internet (TCP/IP) và “sockets” vào UNIX. Dòng kia là System V do AT&T bán ra. Sau này hai dòng vay mượn lẫn nhau. Nhớ nhé: sockets để lập trình mạng ra đời ở nhánh BSD, năm 1983.

    From the Seventh Edition (1979), UNIX diverged into two important variants. At the University of California, Berkeley, Bill Joy and several graduate students developed BSD (the Berkeley Software Distribution); the first full distribution was 3BSD (Dec 1979), and 4.2BSD (1983) contained a complete TCP/IP implementation and the sockets API.1 The other branch, after AT&T was permitted to market UNIX, was System V (1983), whose definitive SVR4 (System V Release 4) in 1989 incorporated many BSD features, including networking.1

    Bạn gặp nó ở đâuWhere you meet it Linux kế thừa cả hai dòng: khi Chương 56 dạy sockets, đó là di sản BSD; khi các chương sau nói semaphore hay message queue “System V”, đó là di sản System V.1 Linux lấy cái hay của cả hai nhánh, nên bạn sẽ gặp lại cả tên “BSD” lẫn “System V” ở các chương sau. Linux inherits both: when Chapter 56 teaches sockets, that is the BSD legacy; when later chapters mention “System V” semaphores or message queues, that is the System V legacy.1
  3. why C spread

    Vì sao C lan rộng — nhỏ, gọn, và khả chuyển Vì sao C được dùng khắp nơi Why C spread — small, terse, portable

    Kerrisk lý giải vì sao C, và hậu duệ C++, thành ngôn ngữ lập trình hệ thống phổ biến đến thế. Các ngôn ngữ đương thời ra đời cho mục đích khác: FORTRAN cho tính toán khoa học, COBOL cho xử lý dữ liệu nghiệp vụ. C thì lấp một khoảng trống: nó được một nhóm nhỏ cá nhân thiết kế quanh một mục tiêu duy nhất — viết nhân UNIX và phần mềm đi kèm — nên kết quả là một ngôn ngữ nhỏ, hiệu quả, súc tích, mô-đun và nhất quán trong thiết kế.1

    C được thiết kế cho đúng một việc: viết hệ điều hành. Khác với các ngôn ngữ to do cả hội đồng lớn làm ra, C nhỏ và gọn, do một nhóm ít người dựng nên. Nhỏ và rõ nên nó chạy được ở nhiều nơi và sống rất lâu. Nhớ nhé: C thắng vì nhỏ, nhanh và dễ mang đi.

    Kerrisk explains why C, and its descendant C++, became so widely used as systems-programming languages. Contemporary languages were designed for other purposes: FORTRAN for scientific computation, COBOL for business data processing. C filled a niche: it was designed by a few individuals working toward a single goal — implementing the UNIX kernel and associated software — so the result was a language small, efficient, terse, modular, and coherent in design.1

    Bạn gặp nó ở đâuWhere you meet it Toàn bộ cuốn sách này gọi các API của Linux qua giao diện ngôn ngữ C — vì đó vẫn là ngôn ngữ “bản xứ” của nhân và của thư viện C. Cả cuốn sách này đều ra lệnh cho Linux bằng ngôn ngữ C. This whole book calls Linux's APIs through the C-language interface — because C is still the native tongue of the kernel and the C library.

Cụm khái niệm 02 Concept cluster 02

Hai dòng chảy gặp nhau: dự án GNU và nhân Linux GNU và nhân Linux — hai mảnh ghép lại thành một Two currents meet: the GNU project and the Linux kernel

Kerrisk nhấn mạnh một điểm hay bị nhầm: từ Linux thường dùng để chỉ cả hệ điều hành kiểu UNIX, nhưng nhân Linux chỉ là một phần của nó. Nhiều thành phần cốt lõi trong một bản phân phối (distribution) Linux thương mại thực ra đến từ một dự án có trước Linux nhiều năm: dự án GNU.12

Nhiều người tưởng “Linux” là toàn bộ hệ điều hành. Thật ra Linux chỉ là phần lõi (nhân). Rất nhiều phần còn lại đến từ một dự án tên GNU, có trước Linux nhiều năm. Ghép hai thứ lại mới thành hệ điều hành bạn dùng. Nhớ nhé: hệ điều hành bạn chạy = nhân Linux + phần mềm GNU.

Kerrisk stresses a point often confused: the term Linux is commonly used for the whole UNIX-like operating system, but the Linux kernel is only one part of it. Many core components of a commercial Linux distribution actually come from a project that predates Linux by several years: the GNU project.12

Định nghĩa. GNU là một từ viết tắt đệ quy: “GNU's not UNIX” (GNU không phải UNIX). Năm 1984, Richard Stallman khởi xướng dự án GNU để làm một hệ điều hành kiểu UNIX hoàn toàn tự do; năm 1985 ông lập Free Software Foundation (FSF) để hỗ trợ nó.12 Ở đây “tự do” (free) hiểu theo nghĩa pháp lý — quyền tự do dùng, đọc, sửa và phân phối lại — chứ không chỉ là miễn phí.2

Nói đơn giản. GNU là một dự án do Richard Stallman lập năm 1984 để tạo ra phần mềm “tự do” — ai cũng được xem mã, sửa và chia sẻ lại. Chữ “tự do” ở đây là về quyền, không phải về giá tiền. Nhớ nhé: “free” trong GNU là tự do, không phải miễn phí.

Definition. GNU is a recursive acronym: “GNU's not UNIX.” In 1984, Richard Stallman started the GNU project to build an entirely free UNIX-like operating system; in 1985 he founded the Free Software Foundation (FSF) to support it.12 Here “free” is meant in a legal sense — the freedom to run, read, modify and redistribute — not merely free of charge.2

1984 dự án GNU (Stallman)
1989 GPL phiên bản 1
1991 GPL v2 · nhân Linux 0.02
1994 Linux 1.0
2003 Linux 2.6

GNU (1984) thiếu nhân
  +
nhân Linux (1991)
  =
hệ điều hành hoàn chỉnh

1984 GNU project (Stallman)
1989 GPL version 1
1991 GPL v2 · Linux kernel 0.02
1994 Linux 1.0
2003 Linux 2.6

  1. GNU & the GPL

    GNU và GPL — gần xong, chỉ thiếu cái nhân GNU làm gần đủ, nhưng còn thiếu nhân GNU & the GPL — nearly complete, but missing a kernel

    Một kết quả quan trọng của dự án GNU là GNU General Public License (GPL) — hiện thân pháp lý cho quan niệm phần mềm tự do của Stallman; bản đầu tiên ra năm 1989, phiên bản 2 (1991) vẫn được nhân Linux dùng, và phiên bản 3 ra năm 2007.13 Đến đầu thập niên 1990, GNU đã có cả một kho công cụ nổi tiếng — trình soạn thảo Emacs, bộ biên dịch GCC, shell bash, thư viện C glibc — nhưng còn thiếu một thành phần then chốt: một nhân UNIX chạy được.12

    GNU viết ra giấy phép GPL để bảo đảm phần mềm luôn tự do. Đến đầu những năm 1990, GNU đã có đủ thứ công cụ hay (trình soạn thảo, trình biên dịch, shell…), chỉ còn thiếu đúng một thứ quan trọng nhất: cái nhân điều khiển máy. Nhớ nhé: GNU gần hoàn chỉnh, chỉ thiếu mỗi cái nhân.

    A key result of the GNU project is the GNU General Public License (GPL) — the legal embodiment of Stallman's notion of free software; its first version appeared in 1989, version 2 (1991) is still used by the Linux kernel, and version 3 appeared in 2007.13 By the early 1990s, GNU had produced a celebrated toolchain — the Emacs editor, the GCC compiler, the bash shell, the glibc C library — but lacked one crucial component: a working UNIX kernel.12

    Bạn gặp nó ở đâuWhere you meet it Khi bạn chạy gcc để dịch các ví dụ trong sách, hoặc gọi hàm thư viện qua glibc, bạn đang dùng trực tiếp sản phẩm của dự án GNU.1 Mỗi lần bạn dịch chương trình bằng gcc, bạn đang dùng công cụ của GNU. When you run gcc to build the book's examples, or call a library function through glibc, you are using GNU's own products directly.1

    Copyleft

    Phần mềm dưới GPL phải được cung cấp ở dạng mã nguồn và tự do phân phối lại; mọi bản sửa đổi khi phát hành cũng phải theo đúng các điều khoản GPL — cơ chế “copyleft” giữ cho phần mềm luôn tự do.13

    GNU/Linux

    Vì phần lớn phần mềm bao quanh nhân đến từ GNU, Stallman thích gọi cả hệ thống là GNU/Linux. Kerrisk nói rõ: vì sách bàn về API của nhân Linux, ông thường chỉ dùng từ Linux.1

  2. the Linux kernel

    Nhân Linux — mảnh ghép còn thiếu, từ Helsinki Nhân Linux — mảnh còn thiếu do Torvalds viết The Linux kernel — the missing piece, from Helsinki

    Năm 1991, Linus Torvalds — sinh viên người Phần Lan ở Đại học Helsinki — bắt tay viết một hệ điều hành cho máy PC dùng chip Intel 80386 của mình, lấy cảm hứng từ Minix, một nhân kiểu UNIX nhỏ do giáo sư Andrew Tanenbaum làm để dạy học.1 Ngày 5 tháng 10 năm 1991, Torvalds công bố phiên bản 0.02 của nhân trên nhóm tin comp.os.minix.1 Ghép nhân này với bộ phần mềm GNU đã gần hoàn chỉnh, cuối cùng ta có một hệ điều hành kiểu UNIX tự do, trọn vẹn.1

    Năm 1991, một sinh viên Phần Lan tên Linus Torvalds tự viết một cái nhân cho máy tính của mình, học hỏi từ một hệ nhỏ tên Minix. Cái nhân đó ghép với phần mềm GNU có sẵn, thế là ra một hệ điều hành tự do hoàn chỉnh. Nhớ nhé: Torvalds viết cái nhân; ghép với GNU là xong hệ điều hành.

    In 1991, Linus Torvalds — a Finnish student at the University of Helsinki — set out to write an operating system for his Intel 80386 PC, inspired by Minix, a small UNIX-like kernel built for teaching by professor Andrew Tanenbaum.1 On 5 October 1991, Torvalds announced version 0.02 of the kernel on the comp.os.minix newsgroup.1 Combined with the nearly complete GNU software, this kernel finally yielded a free, complete UNIX-like operating system.1

    Bạn gặp nó ở đâuWhere you meet it Mỗi system call bạn học trong cuốn này — open, fork, read — cuối cùng đều được chính nhân Linux khởi nguồn từ bản 0.02 năm 1991 ấy phục vụ.1 Mọi lệnh bạn xin ở các chương sau đều do cái nhân này xử lý. Every system call you learn in this book — open, fork, read — is ultimately served by the Linux kernel that began with that 1991 version 0.02.1

    Các mốc phiên bản

    Nhân đạt bản 1.0 vào tháng 3/1994, rồi 2.0 (6/1996), 2.2 (1/1999), 2.4 (1/2001), và 2.6 (12/2003).14 Các chương sau đôi khi ghi rõ tính năng xuất hiện ở bản nhân nào.1

    Cách đánh số x.y.z

    Sau bản 1.0, nhân dùng lược đồ x.y.z: x là phiên bản chính, y phiên bản phụ, z bản sửa. Trước dòng 2.6, số y chẵn là nhánh ổn định, y lẻ là nhánh phát triển.1

  3. distributions

    Bản phân phối — đóng gói nhân cộng phần mềm Bản phân phối — gói sẵn cho bạn cài Distributions — packaging kernel plus software

    Nói chính xác, Linux chỉ là cái nhân; nhưng để có một hệ điều hành dùng được, người ta cần nhân cộng với rất nhiều công cụ và thư viện. Thuở đầu, người dùng phải tự lắp ghép tất cả — tốn công và đòi hỏi chuyên môn. Thị trường vì thế mở ra cho các nhà phân phối (distributor), những người đóng gói sẵn thành distribution: tự động tạo hệ thống tệp, cài nhân và phần mềm cần thiết.1

    Một mình cái nhân thì chưa dùng được. Có người gom nhân cùng hàng loạt công cụ, đóng thành “bản phân phối” để bạn chỉ việc cài là chạy — như Debian, Ubuntu, Red Hat. Nhớ nhé: bản phân phối = nhân + phần mềm, đóng gói sẵn cho dễ cài.

    Strictly, Linux is just the kernel; but a usable operating system needs the kernel plus many tools and libraries. Early on, users had to assemble it all themselves — time-consuming and expert work. A market thus opened for distributors, who package it into a distribution: automatically creating a file system and installing the kernel and the required software.1

    Bạn gặp nó ở đâuWhere you meet it Khi bạn cài Ubuntu, Debian hay Fedora, bạn đang nhận đúng gói “nhân + phần mềm” mà một nhà phân phối đã lắp sẵn. Ubuntu hay Fedora chính là những bản phân phối như thế. When you install Ubuntu, Debian or Fedora, you receive exactly that “kernel + software” bundle a distributor has assembled for you.

Cụm khái niệm 03 Concept cluster 03

Chuẩn hoá — C, POSIX, Single UNIX Specification và LSB Các chuẩn giúp chương trình chạy được nhiều nơi Standardization — C, POSIX, the Single UNIX Specification, and the LSB

Đến cuối thập niên 1980, sự đa dạng của các bản UNIX trở thành gánh nặng: có bản dựa trên BSD, có bản dựa trên System V, mỗi hãng lại thêm tính năng riêng, khiến việc chuyển phần mềm (và cả con người) từ bản này sang bản khác ngày một khó. Sức ép đó sinh ra phong trào chuẩn hoá ngôn ngữ C và hệ thống UNIX, để ứng dụng dễ được port hơn.1

Có quá nhiều phiên bản UNIX, mỗi cái một kiểu, nên chương trình viết cho máy này đem sang máy khác là trục trặc. Người ta bèn ngồi lại thống nhất “luật chơi chung” — gọi là chuẩn — cho cả ngôn ngữ C lẫn hệ điều hành. Nhớ nhé: chuẩn ra đời để kết thúc cảnh mỗi máy một kiểu.

By the late 1980s, the variety of UNIX implementations had become a burden: some were based on BSD, some on System V, and each vendor added its own features, so moving software (and people) between systems grew steadily harder. That pressure produced a drive to standardize the C language and the UNIX system, so applications could be ported more easily.1

Định nghĩa. POSIX (Portable Operating System Interface) là một nhóm chuẩn do IEEE phát triển; cái tên do Richard Stallman đề xuất.1 Chuẩn quan trọng nhất, POSIX.1, mô tả một API mà hệ điều hành tuân thủ phải cung cấp; nó dựa trên API của system call và thư viện C của UNIX, nhưng không buộc dùng một bản hiện thực cụ thể nào.15 POSIX.1 thành chuẩn IEEE năm 1988 và chuẩn ISO năm 1990 (ISO/IEC 9945-1:1990).1

Nói đơn giản. POSIX là một bản “danh sách yêu cầu”: một hệ điều hành muốn gọi là tuân POSIX thì phải cung cấp đủ các hàm trong danh sách đó. Nhờ vậy chương trình viết theo POSIX chạy được trên nhiều hệ. Nhớ nhé: POSIX là danh sách hàm bắt buộc để chương trình đi được nhiều nơi.

Definition. POSIX (Portable Operating System Interface) is a group of standards developed by the IEEE; the name was suggested by Richard Stallman.1 Its most important member, POSIX.1, describes an API that a conforming operating system must provide; it is based on the UNIX system-call and C-library API, but requires no particular implementation.15 POSIX.1 became an IEEE standard in 1988 and an ISO standard in 1990 (ISO/IEC 9945-1:1990).1

C89 (1989, ANSI) · C99 (1999, ISO)
POSIX.1 (IEEE 1988 / ISO 1990)
SUSv3 = POSIX.1-2001 (UNIX 03)
SUSv4 = POSIX.1-2008
LSB → khả chuyển nhị phân

chuẩn ngôn ngữ C
  +
chuẩn hệ điều hành (POSIX/SUS)
  +
LSB (giữa các bản Linux)

C89 (1989, ANSI) · C99 (1999, ISO)
POSIX.1 (IEEE 1988 / ISO 1990)
SUSv3 = POSIX.1-2001 (UNIX 03)
SUSv4 = POSIX.1-2008
LSB → binary portability

  1. the C standards

    Chuẩn C — từ ANSI C tới C99 Chuẩn ngôn ngữ C qua các đời The C standards — from ANSI C to C99

    Đầu thập niên 1980, C đã lan khắp các hệ UNIX và nhiều hệ khác, nhưng xuất hiện những khác biệt nhỏ giữa các bản hiện thực. Sức ép chuẩn hoá lên tới đỉnh năm 1989 với chuẩn C của ANSI (X3.159-1989), được ISO tiếp nhận năm 1990 (ISO/IEC 9899:1990) — thường gọi là C89 (hay C90).16 Một bản sửa đổi được ISO thông qua năm 1999 (ISO/IEC 9899:1999), gọi là C99, thêm những thứ như kiểu long long, kiểu Boolean, và chú thích kiểu C++ (//).16

    Ngôn ngữ C cũng cần một bản mô tả chính thức để mọi trình biên dịch hiểu giống nhau. Bản đầu gọi là C89 (năm 1989); bản sau là C99 (năm 1999), thêm vài tính năng mới. Nhớ nhé: C cũng có “đời”: C89 rồi C99.

    By the early 1980s, C had spread across UNIX systems and beyond, but small differences had arisen between implementations. The drive to standardize culminated in 1989 with the ANSI C standard (X3.159-1989), adopted by ISO in 1990 (ISO/IEC 9899:1990) — usually called C89 (or C90).16 A revision was adopted by ISO in 1999 (ISO/IEC 9899:1999), called C99, adding features such as the long long type, a Boolean type, and C++-style (//) comments.16

    Bạn gặp nó ở đâuWhere you meet it Các chuẩn C độc lập với hệ điều hành: một chương trình chỉ dùng thư viện C chuẩn sẽ khả chuyển tới bất kỳ máy nào có một bản hiện thực C.1 Chương trình chỉ dùng thư viện C chuẩn thì chạy được ở mọi nơi có trình dịch C. The C standards are independent of the operating system: a program using only the standard C library is portable to any machine with a C implementation.1
  2. X/Open & SUS

    X/Open và Single UNIX Specification X/Open và chuẩn SUS gộp chung X/Open and the Single UNIX Specification

    Song song POSIX, nhóm X/Open (một tập hợp các hãng) ra bộ X/Open Portability Guide dựa trên POSIX; bản SUSv2 năm 1997 cho phép hệ tuân thủ tự xưng là UNIX 98.1 Năm 1996, X/Open sáp nhập với Open Software Foundation để lập The Open Group, tổ chức tới nay vẫn phát triển các API ấy.15 Rồi IEEE, The Open Group và ISO/IEC hợp sức trong Austin Group, cho ra POSIX.1-2001 (còn gọi là SUSv3, cũng là UNIX 03) vào tháng 12/2001, hợp nhất POSIX và SUS thành một tài liệu duy nhất.15 Bản SUSv4 (POSIX.1-2008) ra năm 2008.15

    Ngoài POSIX còn một nhóm khác tên X/Open cũng làm chuẩn. Về sau các bên gộp lại cho gọn: POSIX và SUS nhập thành một tài liệu chung (SUSv3 năm 2001, SUSv4 năm 2008). Hệ nào đạt chuẩn mới được gọi là “UNIX” chính thức. Nhớ nhé: cuối cùng mọi chuẩn gộp thành một, do The Open Group giữ.

    Alongside POSIX, the X/Open group (a consortium of vendors) produced the X/Open Portability Guide based on POSIX; the 1997 SUSv2 let a conforming system call itself UNIX 98.1 In 1996, X/Open merged with the Open Software Foundation to form The Open Group, which still develops those APIs.15 Then the IEEE, The Open Group and ISO/IEC collaborated in the Austin Group to produce POSIX.1-2001 (also called SUSv3, and UNIX 03) in December 2001, consolidating POSIX and SUS into a single document.15 SUSv4 (POSIX.1-2008) followed in 2008.15

    Bạn gặp nó ở đâuWhere you meet it Suốt phần còn lại của sách, khi Kerrisk nói “SUSv3 conformance”, ông muốn nói tới mức XSI conformance của chính chuẩn hợp nhất này.1 Về sau trong sách, mỗi lần thấy chữ “SUSv3” chính là nói tới bộ chuẩn gộp này. Throughout the rest of the book, when Kerrisk says “SUSv3 conformance,” he means the XSI conformance of this consolidated standard.1

    Quy mô của SUSv3

    Bản đặc tả nền của SUSv3 dày khoảng 3700 trang và đặc tả 1742 giao diện (interface). Để so sánh, POSIX.1-1990 đặc tả 199 giao diện, còn POSIX.2-1992 đặc tả 130 tiện ích (utility).1

    Một lưu ý về đếm số

    Con số 1742 giao diện là của bản SUSv3 năm 2001; các lần tu chỉnh và bản SUSv4 (2008) về sau bổ sung, loại bỏ và đánh dấu lỗi thời nhiều hàm, nên tổng số thay đổi theo từng phiên bản. Phần thân này giữ đúng con số sách nêu cho SUSv3.15

  3. standards vs the LSB

    Chuẩn hiện thực và LSB — hai loại khả chuyển LSB — giữ cho các bản Linux giống nhau Implementation standards & the LSB — two kinds of portability

    Ngoài các chuẩn do nhóm độc lập đặt ra, đôi khi người ta còn tham chiếu hai chuẩn hiện thực: bản BSD cuối (4.4BSD) và System V Release 4 (SVR4) của AT&T, chuẩn hoá qua System V Interface Definition (SVID, Issue 3 năm 1989).1 Với riêng Linux, vì nhiều nhà phân phối không ai kiểm soát nội dung của nhau, Linux Standard Base (LSB) được lập để bảo đảm tính tương thích: nó đặt chuẩn sao cho một ứng dụng đã biên dịch (chương trình nhị phân) chạy được trên mọi hệ tuân LSB.17

    POSIX giúp cùng một mã nguồn dịch lại chạy được nhiều nơi. LSB thì lo chuyện khác: làm cho một chương trình đã dịch sẵn chạy được trên các bản Linux khác nhau mà không phải dịch lại. Nhớ nhé: POSIX lo mã nguồn, LSB lo chương trình đã dịch.

    Beyond the standards set by independent groups, reference is sometimes made to two implementation standards: the final BSD release (4.4BSD) and AT&T's System V Release 4 (SVR4), formalized through the System V Interface Definition (SVID, Issue 3 in 1989).1 For Linux specifically, because many distributors control none of each other's contents, the Linux Standard Base (LSB) was created to ensure compatibility: it standardizes things so that an already-compiled application (a binary program) runs on any LSB-conformant system.17

    Bạn gặp nó ở đâuWhere you meet it Khả chuyển nhị phân mà LSB hướng tới là điều kiện sống còn cho các ứng dụng thương mại của nhà cung cấp phần mềm độc lập (ISV) trên Linux.1 Nhờ LSB, một phần mềm bán sẵn có thể chạy trên nhiều bản Linux khác nhau. The binary portability the LSB aims at is essential for the commercial applications of independent software vendors (ISVs) on Linux.1

Ba ngộ nhận thường gặp Three common misconceptions

“Linux là toàn bộ hệ điều hành” “Linux is the whole operating system”

Ngộ nhận: “Linux” nghĩa là cả hệ điều hành.

Thực tế: nói chính xác, Linux chỉ là nhân; phần lớn phần mềm bao quanh đến từ dự án GNU, nên có người gọi cả hệ là GNU/Linux.12

Myth: “Linux” means the whole operating system.

Reality: strictly, Linux is just the kernel; most of the surrounding software comes from the GNU project, which is why some call the whole system GNU/Linux.12

“Free trong phần mềm tự do nghĩa là miễn phí” “‘Free’ software means zero price”

Ngộ nhận: “free software” chỉ là phần mềm không mất tiền.

Thực tế: với Stallman, “free” hiểu theo nghĩa pháp lý — tự do dùng, đọc, sửa, phân phối lại — chứ không phải nói về giá.12

Myth: “free software” just means it costs nothing.

Reality: for Stallman, “free” is meant legally — freedom to run, read, modify, redistribute — not a statement about price.12

“Tuân POSIX nghĩa là chương trình nhị phân chạy ở đâu cũng được” “POSIX means a binary runs anywhere”

Ngộ nhận: đạt POSIX là file chạy được đem đâu cũng chạy.

Thực tế: POSIX bảo đảm khả chuyển ở mức mã nguồn (dịch lại rồi chạy); khả chuyển nhị phân là việc của LSB và chỉ trong cùng kiến trúc phần cứng.17

Myth: POSIX conformance lets a compiled file run anywhere.

Reality: POSIX guarantees source-level portability (recompile, then run); binary portability is the LSB's job, and only within the same hardware architecture.17

Tự kiểm Self-check

Năm câu hỏi để biết bạn đã nắm lịch sử và chuẩn Năm câu hỏi kiểm tra nhanh Five questions to check you grasped the history and standards

Trả lời được những câu này nghĩa là bạn đã theo trọn mạch từ UNIX 1969, qua GNU và nhân Linux, tới bộ chuẩn làm nên tính khả chuyển.

Nếu trả lời được, nghĩa là bạn đã hiểu chương này.

Answering these means you followed the whole line from UNIX in 1969, through GNU and the Linux kernel, to the standards that make portability real.

  1. UNIX ra đời năm nào, ở đâu, do ai, và vì sao việc viết lại bằng C năm 1973 lại quan trọng?

    Gợi ý sâu hơn: tính năng nào xuất hiện ở Third Edition còn được bạn dùng mỗi ngày trong shell?

  2. Hai nhánh lớn tách ra từ Seventh Edition là gì, và nhánh nào đem sockets vào UNIX?

    Gợi ý sâu hơn: Linux kế thừa cụ thể những gì từ mỗi nhánh?

  3. Dự án GNU và nhân Linux mỗi bên đóng góp gì? Vì sao gọi cả hệ là GNU/Linux lại có lý?

    Gợi ý sâu hơn: đến đầu thập niên 1990, GNU đã có những công cụ nào và còn thiếu đúng thứ gì?

  4. POSIX là gì, và nó khác chuẩn ngôn ngữ C ở điểm nào?

    Gợi ý sâu hơn: POSIX.1-2001 (SUSv3) hợp nhất những dòng chuẩn nào, và con số 1742 nói lên điều gì?

  5. Khả chuyển mã nguồn (POSIX) khác khả chuyển nhị phân (LSB) ra sao?

    Gợi ý sâu hơn: vì sao khả chuyển nhị phân chỉ có nghĩa trong cùng một kiến trúc phần cứng?

  1. UNIX ra đời khoảng năm nào, và ai viết nó?

  2. “Linux” thật ra chỉ là phần nào của hệ điều hành?

  3. GNU và Linux, mỗi cái cho ta thứ gì để ghép thành hệ điều hành?

  4. Chuẩn như POSIX sinh ra để giải quyết rắc rối gì?

  5. “Free” trong phần mềm tự do nghĩa là gì — miễn phí hay tự do?

  1. When and where was UNIX born, by whom, and why did rewriting it in C in 1973 matter?

  2. What two great branches split from the Seventh Edition, and which brought sockets to UNIX?

  3. What did the GNU project and the Linux kernel each contribute, and why is “GNU/Linux” reasonable?

  4. What is POSIX, and how does it differ from the C-language standard?

  5. How does source portability (POSIX) differ from binary portability (the LSB)?

Khép lại chương Closing the chapter

UNIX bắt đầu năm 1969 trên một máy mini; đến 1973 nó được viết lại bằng C và lan ra khắp các trường đại học nhờ kèm mã nguồn. Hai dòng chảy — GNU và nhân Linux — gặp nhau để tạo một UNIX tự do, và vì UNIX phát triển phân tán, các chuẩn ra đời để tính khả chuyển thành hiện thực.1

UNIX ra đời năm 1969, rồi lan nhanh nhờ cho đi kèm mã nguồn; GNU và Linux ghép lại thành hệ điều hành tự do, và các chuẩn giúp chương trình chạy được nhiều nơi. Nhớ nhé: hiểu gốc gác và luật chơi thì học các chương sau mới vững.

UNIX began in 1969 on a minicomputer; by 1973 it was rewritten in C and spread through universities because it shipped with source. Two currents — GNU and the Linux kernel — met to make a free UNIX, and because UNIX grew in a decentralized way, standards arose to make portability real.1