191
LẬP TRÌNH NGUỒN MỞ TS. Lê Nhật Duy Blog: https://Lnduy.wordpress.com Email: [email protected]

LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Embed Size (px)

Citation preview

Page 1: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

LẬP TRÌNH MÃ NGUỒN MỞ

TS. Lê Nhật Duy

Blog: https://Lnduy.wordpress.com

Email: [email protected]

Page 2: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Nội dung chương trình

Mục tiêu môn họcGiúp sinh viên hiểu về lập trình Shell cho Linux,lập trình C/C++ với giao diện trên Linux

Thời lượng Lý thuyết : 30 tiết Thực hành: 30 tiết

Mục tiêu môn họcGiúp sinh viên hiểu về lập trình Shell cho Linux,lập trình C/C++ với giao diện trên Linux

Thời lượng Lý thuyết : 30 tiết Thực hành: 30 tiết

2

Page 3: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Nội dung chương trình

1. Essential Linux

2. Introduction to Linux Programming

3. Shell Programming

4. Graphics Intergace Programming

5. Qt and Databases

6. Development Tools

1. Essential Linux

2. Introduction to Linux Programming

3. Shell Programming

4. Graphics Intergace Programming

5. Qt and Databases

6. Development Tools

3

Page 4: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Kiểm tra đánh giá

Kiểm tra giữa kỳ Tiểu luận theo nhóm Thi kết thúc môn

Kiểm tra giữa kỳ Tiểu luận theo nhóm Thi kết thúc môn

4

Page 5: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Giáo trình và TLTK

Giáo trìnhNeil Matthew, Richard Stones, “Beginning LinuxProgramming”, 4th Edition, Wiley Publishing,Inc, 2008.

Tài liệu tham khảoSlides bài giảng của giảng viên

Giáo trìnhNeil Matthew, Richard Stones, “Beginning LinuxProgramming”, 4th Edition, Wiley Publishing,Inc, 2008.

Tài liệu tham khảoSlides bài giảng của giảng viên

5

Page 6: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Rules

6

Page 7: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Essential Linux

Page 8: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Contents

1. Introduction Linux and Linux Distributions2. Installing Linux3. Getting Help (using man pages, info and other

documentation resources)4. Using Linux Text Editor5. Managing the Linux File System6. Installing and Managing Software on Linux

1. Introduction Linux and Linux Distributions2. Installing Linux3. Getting Help (using man pages, info and other

documentation resources)4. Using Linux Text Editor5. Managing the Linux File System6. Installing and Managing Software on Linux

2

Page 9: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

What is Linux ?

Linux is an Unix-like operating system Linux is an free and open source software Linux is a leading server operating system

Multi-user, security, stability, …

3

Linux is an Unix-like operating system Linux is an free and open source software Linux is a leading server operating system

Multi-user, security, stability, …

Page 10: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

What is Linux ?

Linux is an operating system,provides key functions in a computer system: Application Platform Hardware Moderator Data Storage Security Connectivity

4

Linux is an operating system,provides key functions in a computer system: Application Platform Hardware Moderator Data Storage Security Connectivity

Page 11: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The History of Linux

GNU/Linux

5

Page 12: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The History of Linux

Richard Matthew Stallman (born March 16, 1953), is anAmerican software freedom activist and computer program Is a student at Harvard University a programmer at the MIT Artificial Intelligence Laboratory

In September 1983, he launched the GNU Project to create afree Unix-like operating system

With the launch of the GNU Project, he initiated the freesoftware movement. In October 1985, he founded the FreeSoftware Foundation, and in 1989 he wrote the GNU GeneralPublic License (GNU GPL)

6

Richard Matthew Stallman (born March 16, 1953), is anAmerican software freedom activist and computer program Is a student at Harvard University a programmer at the MIT Artificial Intelligence Laboratory

In September 1983, he launched the GNU Project to create afree Unix-like operating system

With the launch of the GNU Project, he initiated the freesoftware movement. In October 1985, he founded the FreeSoftware Foundation, and in 1989 he wrote the GNU GeneralPublic License (GNU GPL)

Page 13: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The History of Linux

By the early 1990s, many of the programs required in theGNU project’s operating system (such as libraries,compilers, text editors, a Unix shell, and a windowingsystem) were completed, although low-level elementssuch as device drivers, daemons, and the kernel werestalled and incomplete.

In 1991, in Helsinki, Linus Torvalds began a project thatlater became the Linux kernel Development was done on MINIX using the GNU C compiler

7

By the early 1990s, many of the programs required in theGNU project’s operating system (such as libraries,compilers, text editors, a Unix shell, and a windowingsystem) were completed, although low-level elementssuch as device drivers, daemons, and the kernel werestalled and incomplete.

In 1991, in Helsinki, Linus Torvalds began a project thatlater became the Linux kernel Development was done on MINIX using the GNU C compiler

Page 14: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The History of Linux

The first release of the Linux kernel, Linux 0.01, includeda binary of GNU's Bash shell

In 1992, he suggested releasing the kernel under the GNUGeneral Public License. He first announced this decision in the release notes of version

0.12. In the middle of December 1992 he published version 0.99 using

the GNU GPL

Linux and GNU developers worked to integrate GNUcomponents with Linux to make a fully-functional andfree operating system.

8

The first release of the Linux kernel, Linux 0.01, includeda binary of GNU's Bash shell

In 1992, he suggested releasing the kernel under the GNUGeneral Public License. He first announced this decision in the release notes of version

0.12. In the middle of December 1992 he published version 0.99 using

the GNU GPL

Linux and GNU developers worked to integrate GNUcomponents with Linux to make a fully-functional andfree operating system.

Page 15: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Linux Distributions

A Linux distribution (also called GNU/Linuxdistribution or distro for short ) is a member of thefamily of Unix-like operating systems built on top of the Linux kernel consist a set of libraries and utilities from the GNU

project

9

A Linux distribution (also called GNU/Linuxdistribution or distro for short ) is a member of thefamily of Unix-like operating systems built on top of the Linux kernel consist a set of libraries and utilities from the GNU

project

Page 16: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Linux Distributions ..

Linux distributions have taken a wide variety of forms Commercial or non-commercial; Designed for enterprise users, power users, or for home

users; Supported on multiple types of hardware, or platform-

specific, even to the extent of certification by the platformvendor;

Designed for servers, desktops, or embedded devices; General purpose or highly specialized toward specific

machine functionalities (e.g. firewalls, network routers, andcomputer clusters);

Built primarily for security, usability, portability, orcomprehensiveness.

10

Linux distributions have taken a wide variety of forms Commercial or non-commercial; Designed for enterprise users, power users, or for home

users; Supported on multiple types of hardware, or platform-

specific, even to the extent of certification by the platformvendor;

Designed for servers, desktops, or embedded devices; General purpose or highly specialized toward specific

machine functionalities (e.g. firewalls, network routers, andcomputer clusters);

Built primarily for security, usability, portability, orcomprehensiveness.

Page 17: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Linux Distributions …

Today there are hundreds of differentdistributions available popular■ SUSE Linux ■ TurboLinux■ Fedora Linux ■ Mandrake Linux■ Red Hat Enterprise Linux ■ Lycoris Linux■ Debian Linux■ CentOS ■ Linspire■ ALT Linux■ Gentoo Linux ■ Ubuntu

■Slackware Linux

11

Today there are hundreds of differentdistributions available popular■ SUSE Linux ■ TurboLinux■ Fedora Linux ■ Mandrake Linux■ Red Hat Enterprise Linux ■ Lycoris Linux■ Debian Linux■ CentOS ■ Linspire■ ALT Linux■ Gentoo Linux ■ Ubuntu

■Slackware Linux

Page 18: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Linux Distributions …

12

Page 19: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Roles of Linux

Desktop operating system Server operating system Firewall

13

Desktop operating system Server operating system Firewall

Page 20: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Components of Linux

The Linux Kernel Libraries Utilities User Interface

User

14

The Linux Kernel Libraries Utilities User Interface

Page 21: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

User InterfaceLinux Graphical User Interface The Linux GUI is composed of the following components:

X Window System The X Window System provides the base system for the graphical interface on

Linux. It allows programmers to run applications in windows. It also allowsusers to move windows around on the screen as well as click on items with themouse.

Window manager The role of the window manager is to control the appearance of the windows

on the screen. It also determines how they are arranged on the screen. GUI toolkit

GUI toolkits are libraries used by programmers to create X Windowapplications. On Linux, the GTK+, Motif, and Qt toolkits are commonly used.

Desktop environment The desktop environment is used to actually present the GUI desktop to the

end user. It allows you to place icons on the desktop, customize the appearanceof your windows, add wallpaper to the desktop background, and so on. Twovery popular Linux desktop environments include the K Desktop Environment(KDE) and GNOME.

15

The Linux GUI is composed of the following components: X Window System

The X Window System provides the base system for the graphical interface onLinux. It allows programmers to run applications in windows. It also allowsusers to move windows around on the screen as well as click on items with themouse.

Window manager The role of the window manager is to control the appearance of the windows

on the screen. It also determines how they are arranged on the screen. GUI toolkit

GUI toolkits are libraries used by programmers to create X Windowapplications. On Linux, the GTK+, Motif, and Qt toolkits are commonly used.

Desktop environment The desktop environment is used to actually present the GUI desktop to the

end user. It allows you to place icons on the desktop, customize the appearanceof your windows, add wallpaper to the desktop background, and so on. Twovery popular Linux desktop environments include the K Desktop Environment(KDE) and GNOME.

Page 22: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

User InterfaceLinux Command-Line Interface (CLI)

The Linux command line interface is created by shells sh (Bourne Shell) bash (Bourne-Again Shell) csh (C Shell) tsch zsh (Z Shell)

The bash shell is the default shell for most distributions A shell is a command interpreter that allows you to type

commands from the keyboard to interact with the operatingsystem kernel.

16

The Linux command line interface is created by shells sh (Bourne Shell) bash (Bourne-Again Shell) csh (C Shell) tsch zsh (Z Shell)

The bash shell is the default shell for most distributions A shell is a command interpreter that allows you to type

commands from the keyboard to interact with the operatingsystem kernel.

Page 23: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Getting Help

Page 24: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Overview

Using the various sources of information to learnabout Linux system.

Include : man utility info utility README files Web-based resources

18

Using the various sources of information to learnabout Linux system.

Include : man utility info utility README files Web-based resources

Page 25: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Using Linux Text Editors

Page 26: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Overview

Use Non-Graphical Linux Text Editors (vi, vim,nano, emacs …)

Graphical Text Editors

20

Page 27: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Overview

Two reasons to learn text manipulation tools Configuration information is stored in a variety of text

files, in the /etc directory Using a text editor to edit these files to customize the

system.$ vi /etc/inittab

21

Two reasons to learn text manipulation tools Configuration information is stored in a variety of text

files, in the /etc directory Using a text editor to edit these files to customize the

system.$ vi /etc/inittab

Page 28: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Using the vi Editor

Two versions of vi vi vim (Vi IMproved)

Replacing vi version on the most newer Linux distributions

Program file locate in /bin When execute the vi program, /usr/bin/vi file called

This is a symbolic link file, points to the /bin/vim executable file

22

Two versions of vi vi vim (Vi IMproved)

Replacing vi version on the most newer Linux distributions

Program file locate in /bin When execute the vi program, /usr/bin/vi file called

This is a symbolic link file, points to the /bin/vim executable file

Page 29: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

vi Modes

Switch to Insert modepress I or S or <Insert>

Switch to Replace modepress <Insert>

Switch to Command modepress ESC and press :

Escape current modepress ESC

23

Switch to Command modepress ESC and press :

Escape current modepress ESC

Insert mode Command mode

After starting Vi

Press ESC + :

Press ESC + <insert>

Press Insert Press :

Page 30: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Commands in Command mode

■ w and ENTERWrites the current file

■ w filename and ENTERWrites the current file to a different file name

■ exit and ENTERWrites the current file and then closes vi. Or press wq

■ q Closes vi without saving the current file. This can onlybe used if the file hasn’t been changed. If the file has beenchanged, then you must enter q!

24

■ w and ENTERWrites the current file

■ w filename and ENTERWrites the current file to a different file name

■ exit and ENTERWrites the current file and then closes vi. Or press wq

■ q Closes vi without saving the current file. This can onlybe used if the file hasn’t been changed. If the file has beenchanged, then you must enter q!

Page 31: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Using the Emacs Editor• Emacs is a more powerfultext-based editor• It can use either keyboardcommands or a menu-driveninterface that can bemanipulated with yourmouse.• You will need to install theEmacs package on yourLinux system before you canuse the program.

25

• Emacs is a more powerfultext-based editor• It can use either keyboardcommands or a menu-driveninterface that can bemanipulated with yourmouse.• You will need to install theEmacs package on yourLinux system before you canuse the program.

Page 32: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Use Graphical Text Editors

These editors can only be used if the followingconditions are true:■ The system is working properly.■ The system has X Windows, a window manager, and a desktop

installed.■ Your X Window System has been configured properly to work

with your hardware

Some of graphic editors are : Kate X emacs gedit

26

These editors can only be used if the followingconditions are true:■ The system is working properly.■ The system has X Windows, a window manager, and a desktop

installed.■ Your X Window System has been configured properly to work

with your hardware

Some of graphic editors are : Kate X emacs gedit

Page 33: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Linux File System

Page 34: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The Hierarchical Structure of the LinuxFile System

/root directory

28

home etc

local bin

bin boot dev lib root …usr

Sub directories

Page 35: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

/ - The root directory. The starting point of your directorystructure. . Every other file and directory on your system is under the rootdirectory.

/bin - contains shells (bash) and file system managementutilities

/etc - keep linux text-based configuration files /boot - keep important linux booting files /dev - keep all device files /usr - keep all user binary and X library /home - keep user home directory /proc - is pseudo file system for tracking running process and state

of linux system

The Hierarchical Structure of the LinuxFile System

29

/ - The root directory. The starting point of your directorystructure. . Every other file and directory on your system is under the rootdirectory.

/bin - contains shells (bash) and file system managementutilities

/etc - keep linux text-based configuration files /boot - keep important linux booting files /dev - keep all device files /usr - keep all user binary and X library /home - keep user home directory /proc - is pseudo file system for tracking running process and state

of linux system

Page 36: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

/var - keeping variable data, log file andprinter spooling

/lib - contain shared library that isrequired by system program

/tmp - contain system temporary file /root - the root user’s home directory /sbin - contains important system management and

admin files (fdisk, fsck, ifconfig, init, mkfs,shutdown, halt)

/media - system use to mount externel devices(CD/DVD , floppy drives) (or /mnt)

The Hierarchical Structure of the LinuxFile System

30

/var - keeping variable data, log file andprinter spooling

/lib - contain shared library that isrequired by system program

/tmp - contain system temporary file /root - the root user’s home directory /sbin - contains important system management and

admin files (fdisk, fsck, ifconfig, init, mkfs,shutdown, halt)

/media - system use to mount externel devices(CD/DVD , floppy drives) (or /mnt)

Page 37: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Navigating the File System

Path absolute path Current directory & relative path

Current directory (.) and parent directory (..) Home directory ( ~ )

31

Path absolute path Current directory & relative path

Current directory (.) and parent directory (..) Home directory ( ~ )

Page 38: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Path /

home etc bin boot dev lib root …usr

a b c /home/a/hoso absolute path

32

Hoso Vd.txt

Vd1.txt

relative path

hoso

a/hoso

home/a/hoso

If current directory

/home/a

/home

/

Page 39: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Current directory and Relative path

pwd, cd pwd (Present Working Directory)

Display the current directory $ pwd

cd Change the current directory $ cd /var/log $ cd .. ( cd ./.. ) $ cd ~ (or press cd )

33

pwd, cd pwd (Present Working Directory)

Display the current directory $ pwd

cd Change the current directory $ cd /var/log $ cd .. ( cd ./.. ) $ cd ~ (or press cd )

Page 40: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Introduction to LinuxProgramming

Page 41: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Contents1. The GNU Project and the Free Software Foundation2. Programming Linux3. The Linux Environment4. Terminals5. Library Functions6. Low-Level File Access7. The Standard I/O Library8. Formatted Input & Output, File & Directories9. The /proc File System

1. The GNU Project and the Free Software Foundation2. Programming Linux3. The Linux Environment4. Terminals5. Library Functions6. Low-Level File Access7. The Standard I/O Library8. Formatted Input & Output, File & Directories9. The /proc File System

2

Page 42: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

GNU/Linux

3

Page 43: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

GNU - GPL

Tác giả vẫn giữ bản quyền đối với với phần mềm gốc. Người sử dụng có quyền :

Tự do chạy chương trình, cho bất cứ mục đích nào. Tự do tái phân phối bản sao. Tự do tìm hiểu cách hoạt động của chương trình, tự do sửa đổi

nó và phát hành những gì sửa đổi ra công cộng. Người sử dụng có thể thay đổi một phần của chương trình và phân

phối thay đổi của mình cùng toàn bộ phần mềm cho người khác,với điều kiện nói rõ phần mình thay đổi.

Phải đảm bảo cung cấp mã nguồn khi bán một sản phẩm theoGNU GPL để người khác có thể sử dụng và/hoặc bán tiếp. Ngườidùng kế tiếp có đầy đủ quyền lợi như của người trước.

4

Tác giả vẫn giữ bản quyền đối với với phần mềm gốc. Người sử dụng có quyền :

Tự do chạy chương trình, cho bất cứ mục đích nào. Tự do tái phân phối bản sao. Tự do tìm hiểu cách hoạt động của chương trình, tự do sửa đổi

nó và phát hành những gì sửa đổi ra công cộng. Người sử dụng có thể thay đổi một phần của chương trình và phân

phối thay đổi của mình cùng toàn bộ phần mềm cho người khác,với điều kiện nói rõ phần mình thay đổi.

Phải đảm bảo cung cấp mã nguồn khi bán một sản phẩm theoGNU GPL để người khác có thể sử dụng và/hoặc bán tiếp. Ngườidùng kế tiếp có đầy đủ quyền lợi như của người trước.

Page 44: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Programming Linux List of programming languages available to the Linux

programmer:

5

Page 45: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Linux Programs

Linux applications are represented by two specialtypes of files: executables and scripts.Executable files are programs that can be rundirectly by the computer; they correspond toWindows .exe files. Scripts are collections ofinstructions for another program, an interpreter, tofollow. These correspond to Windows .bat or.cmd files, or interpreted BASIC programs.

Linux applications are represented by two specialtypes of files: executables and scripts.Executable files are programs that can be rundirectly by the computer; they correspond toWindows .exe files. Scripts are collections ofinstructions for another program, an interpreter, tofollow. These correspond to Windows .bat or.cmd files, or interpreted BASIC programs.

6

Page 46: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The First Linux C Program#include <stdio.h>#include <stdlib.h>int main(){

printf(“Hello World\n”);exit(0);

}gcc -o hello hello.c./hello

#include <stdio.h>#include <stdlib.h>int main(){

printf(“Hello World\n”);exit(0);

}gcc -o hello hello.c./hello

7

Page 47: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Static Libraries

// file fred.c#include <stdio.h>void fred(int arg){

printf(“fred: wepassed %d\n”, arg);

}

gcc -c bill.c fred.c

//file bill.c#include <stdio.h>void bill(char *arg){

printf(“bill: wepassed %s\n”, arg);

}

// file fred.c#include <stdio.h>void fred(int arg){

printf(“fred: wepassed %d\n”, arg);

}

gcc -c bill.c fred.c

//file bill.c#include <stdio.h>void bill(char *arg){

printf(“bill: wepassed %s\n”, arg);

}

8

Page 48: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Compile the program and test it

#include <stdlib.h>#include “lib.h”int main(){

bill(“Hello World”);exit(0);

}gcc -c program.cgcc -o program program.o bill.o./program

#include <stdlib.h>#include “lib.h”int main(){

bill(“Hello World”);exit(0);

}gcc -c program.cgcc -o program program.o bill.o./program

9

Page 49: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Libraries (cont.)

Create and use a library. Use the ar program tocreate the archive and add your object files to it.The program is called ar because it createsarchives, or collections, of individual files placedtogether in one large file. Note that we can alsouse ar to create archives of files of any type.

$ ar crv libfoo.a bill.o fred.oa - bill.oa - fred.o

Create and use a library. Use the ar program tocreate the archive and add your object files to it.The program is called ar because it createsarchives, or collections, of individual files placedtogether in one large file. Note that we can alsouse ar to create archives of files of any type.

$ ar crv libfoo.a bill.o fred.oa - bill.oa - fred.o

10

Page 50: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Libraries (cont.)

To use the library successfully, some systems,notably those derived from Berkeley UNIX,require that a table of contents be created for thelibrary. Do this with the ranlib command. InLinux, this step isn’t necessary when you’re usingthe GNU software development tools.

$ ranlib libfoo.a$ gcc -o program program.o libfoo.a$ ./program

To use the library successfully, some systems,notably those derived from Berkeley UNIX,require that a table of contents be created for thelibrary. Do this with the ranlib command. InLinux, this step isn’t necessary when you’re usingthe GNU software development tools.

$ ranlib libfoo.a$ gcc -o program program.o libfoo.a$ ./program

11

Page 51: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

12

Page 52: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Shared Libraries

One disadvantage of static libraries is that whenyou run many applications at the same time andthey all use functions from the same library, youmay end up with many copies of the samefunctions in memory and indeed many copies inthe program files themselves. This can consume alarge amount of valuable memory and disk space.

One disadvantage of static libraries is that whenyou run many applications at the same time andthey all use functions from the same library, youmay end up with many copies of the samefunctions in memory and indeed many copies inthe program files themselves. This can consume alarge amount of valuable memory and disk space.

13

Page 53: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Share …

Many UNIX systems and Linux-support sharedlibraries can overcome this disadvantage. A completediscussion of shared libraries and theirimplementation on different systems is beyond thescope of this book, so we’ll restrict ourselves to thevisible implementation under Linux. Shared librariesare stored in the same places as static libraries, butshared libraries have a different filename suffix. On atypical Linux system, the shared version of thestandard math library is /lib/libm.so.

Many UNIX systems and Linux-support sharedlibraries can overcome this disadvantage. A completediscussion of shared libraries and theirimplementation on different systems is beyond thescope of this book, so we’ll restrict ourselves to thevisible implementation under Linux. Shared librariesare stored in the same places as static libraries, butshared libraries have a different filename suffix. On atypical Linux system, the shared version of thestandard math library is /lib/libm.so.

14

Page 54: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Shell Programming

Page 55: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Contents❑What a shell is❑ Basic considerations❑ The subtleties of syntax: variables, conditions, and

program control❑ Lists❑ Functions❑ Commands and command execution❑ Here documents❑ Debugging❑ grep and regular expressions❑ find

❑What a shell is❑ Basic considerations❑ The subtleties of syntax: variables, conditions, and

program control❑ Lists❑ Functions❑ Commands and command execution❑ Here documents❑ Debugging❑ grep and regular expressions❑ find

2

Page 56: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

What Is a Shell?

A shell is a programthat acts as the interfacebetween you and theLinux system, enablingyou to enter commandsfor the operating systemto execute.

A shell is a programthat acts as the interfacebetween you and theLinux system, enablingyou to enter commandsfor the operating systemto execute.

3

Page 57: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Shell …

On Linux, the standard shell that is alwaysinstalled as /bin/sh is called bash (the GNUBourne-Again SHell). On most Linuxdistributions, the program /bin/sh, the defaultshell, is actually a link to the program /bin/bash.

/bin/bash --version

On Linux, the standard shell that is alwaysinstalled as /bin/sh is called bash (the GNUBourne-Again SHell). On most Linuxdistributions, the program /bin/sh, the defaultshell, is actually a link to the program /bin/bash.

/bin/bash --version

4

Page 58: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

5

Page 59: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Pipes and Redirection

Redirecting Output $ ls -l > lsoutput.txt To append to the file, use the >> operator. For

example, $ ps >> lsoutput.txt will append theoutput of the ps command to the end of thespecified file.

Redirecting Output $ ls -l > lsoutput.txt To append to the file, use the >> operator. For

example, $ ps >> lsoutput.txt will append theoutput of the ps command to the end of thespecified file.

6

Page 60: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Redirecting Input

Rather like redirecting output, you can alsoredirect input

$ more < killout.txt

7

Page 61: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Pipes - the pipe operator ( | )

In Linux, unlike in MS-DOS, processes connectedby pipes can run simultaneously and areautomatically rescheduled as data flows betweenthem.

sort psout.txt > sort.out

In Linux, unlike in MS-DOS, processes connectedby pipes can run simultaneously and areautomatically rescheduled as data flows betweenthem.

sort psout.txt > sort.out

8

Page 62: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The Shell as a Programming Language

# Creating a Script first#!/bin/bash (or #!/bin/sh)for file in *doif grep -q POSIX $filethenecho $filefidoneexit 0

Making a ScriptExecutable

1. $ /bin/sh first2. $ chmod +x first

$ first

# Creating a Script first#!/bin/bash (or #!/bin/sh)for file in *doif grep -q POSIX $filethenecho $filefidoneexit 0

Making a ScriptExecutable

1. $ /bin/sh first2. $ chmod +x first

$ first

9

Page 63: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The Shell ..

The command wasn’t found??? This is almostcertainly because the shell environment variablePATH isn’t set to look in the current directory forcommands to execute. To change this, either typePATH=$PATH: . on the command line or edityour .bash_profile file to add this command tothe end of the file; then log out and log back inagain. Alternatively, type ./first in the directorycontaining the script, to give the shell the fullrelative path to the file

The command wasn’t found??? This is almostcertainly because the shell environment variablePATH isn’t set to look in the current directory forcommands to execute. To change this, either typePATH=$PATH: . on the command line or edityour .bash_profile file to add this command tothe end of the file; then log out and log back inagain. Alternatively, type ./first in the directorycontaining the script, to give the shell the fullrelative path to the file

10

Page 64: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Cont …

In Linux you can delete a file if you have writepermission on the directory that contains it. To besafe, ensure that only the superuser can write todirectories containing files that you want to keepsafe. This makes sense because a directory is justanother file, and having write permission to adirectory file allows users to add and removenames.

# chmod u=rwx,go=rx /usr/local/bin/first

In Linux you can delete a file if you have writepermission on the directory that contains it. To besafe, ensure that only the superuser can write todirectories containing files that you want to keepsafe. This makes sense because a directory is justanother file, and having write permission to adirectory file allows users to add and removenames.

# chmod u=rwx,go=rx /usr/local/bin/first

11

Page 65: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Shell Syntax

Variables: strings, numbers, environments, andparameters

Conditions: shell Booleans Program control: if, elif, for, while, until, case Lists Functions Commands built into the shell Getting the result of a command Here documents

Variables: strings, numbers, environments, andparameters

Conditions: shell Booleans Program control: if, elif, for, while, until, case Lists Functions Commands built into the shell Getting the result of a command Here documents

12

Page 66: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Variables#!/bin/shmyvar=”Hi there”echo $myvarecho “$myvar”echo ‘$myvar’echo \$myvarecho Enter some textread myvarecho ‘$myvar’ now equals $myvarexit 0

#!/bin/shmyvar=”Hi there”echo $myvarecho “$myvar”echo ‘$myvar’echo \$myvarecho Enter some textread myvarecho ‘$myvar’ now equals $myvarexit 0

13

Page 67: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Environment Variables

14

Page 68: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Parameter Variables

15

Page 69: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Manipulating Parameter and Environment Variables

#!/bin/shsalutation=”Hello”echo $salutationecho “The program $0 is now running”echo “The second parameter was $2”echo “The first parameter was $1”echo “The parameter list was $*“echo “The user’s home directory is $HOME”echo “Please enter a new greeting”read salutationecho $salutationecho “The script is now complete”exit 0

#!/bin/shsalutation=”Hello”echo $salutationecho “The program $0 is now running”echo “The second parameter was $2”echo “The first parameter was $1”echo “The parameter list was $*“echo “The user’s home directory is $HOME”echo “Please enter a new greeting”read salutationecho $salutationecho “The script is now complete”exit 0 16

Page 70: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Conditions

The test or [ Commandif test -f fred.cthen...fi

if [ -f fred.c ]then...fi------------------------------if [ -f fred.c ]; then...fi

The test or [ Commandif test -f fred.cthen...fi

if [ -f fred.c ]then...fi------------------------------if [ -f fred.c ]; then...fi

17

Page 71: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The condition types that you can use with the test commandfall into three types: string comparison, arithmeticcomparison, and file conditionals. The following tabledescribes these condition types:

18

Page 72: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

19

Page 73: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

20

Page 74: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Control Structures#!/bin/shecho “Is it morning? Please answer yes or no”read timeofdayif [ $timeofday = “yes” ]thenecho “Good morning”elif [ $timeofday = “no” ]; thenecho “Good afternoon”elseecho “Sorry, $timeofday not recognized. Enter yes or no”exit 1fiexit 0

#!/bin/shecho “Is it morning? Please answer yes or no”read timeofdayif [ $timeofday = “yes” ]thenecho “Good morning”elif [ $timeofday = “no” ]; thenecho “Good afternoon”elseecho “Sorry, $timeofday not recognized. Enter yes or no”exit 1fiexit 0

21

Page 75: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

for

for variable in valuesdostatementsdone

#!/bin/shfor foo in bar fud 43doecho $foodoneexit 0

for variable in valuesdostatementsdone

#!/bin/shfor foo in bar fud 43doecho $foodoneexit 0

22

Page 76: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

while

while condition dostatementsdone

#!/bin/shecho “Enter password”read trythiswhile [ “$trythis” !=

“secret” ]; doecho “Sorry, try again”read trythisdoneexit 0

#!/bin/shecho “Enter password”read trythiswhile [ “$trythis” !=

“secret” ]; doecho “Sorry, try again”read trythisdoneexit 0

23

Page 77: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

until

until conditiondostatementsdone

#!/bin/bashuntil who | grep “$1” > /dev/nulldosleep 60done# now ring the bell and announce

the expected user.echo -e ‘\a’echo “**** $1 has just logged in

****“exit 0

until conditiondostatementsdone

#!/bin/bashuntil who | grep “$1” > /dev/nulldosleep 60done# now ring the bell and announce

the expected user.echo -e ‘\a’echo “**** $1 has just logged in

****“exit 0

24

Page 78: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

case

case variable inpattern [ | pattern] ...)

statements;;pattern [ | pattern] ...)

statements;;...esac

#!/bin/shecho “Is it morning? Please

answer yes or no”read timeofdaycase “$timeofday” inyes) echo “Good Morning”;;no ) echo “Good Afternoon”;;y ) echo “Good Morning”;;n ) echo “Good Afternoon”;;* ) echo “Sorry, answer not

recognized”;;esacexit 0

case variable inpattern [ | pattern] ...)

statements;;pattern [ | pattern] ...)

statements;;...esac

#!/bin/shecho “Is it morning? Please

answer yes or no”read timeofdaycase “$timeofday” inyes) echo “Good Morning”;;no ) echo “Good Afternoon”;;y ) echo “Good Morning”;;n ) echo “Good Afternoon”;;* ) echo “Sorry, answer not

recognized”;;esacexit 0

25

Page 79: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Lists

if [ -f this_file ]; thenif [ -f that_file ]; thenif [ -f the_other_file ]; thenecho “All files present, and correct”fififi

if [ -f this_file ]; thenif [ -f that_file ]; thenif [ -f the_other_file ]; thenecho “All files present, and correct”fififi

26

Page 80: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The AND Liststatement1 && statement2 && statement3 && ...#!/bin/shtouch file_onerm -f file_twoif [ -f file_one ] && echo “hello” && [ -f file_two ] && echo “

there”thenecho “in if”elseecho “in else”fiexit 0

statement1 && statement2 && statement3 && ...#!/bin/shtouch file_onerm -f file_twoif [ -f file_one ] && echo “hello” && [ -f file_two ] && echo “

there”thenecho “in if”elseecho “in else”fiexit 0

27

Page 81: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The OR List

statement1 || statement2 || statement3 || ...#!/bin/shrm -f file_oneif [ -f file_one ] || echo “hello” || echo “ there”thenecho “in if”elseecho “in else”fiexit 0

statement1 || statement2 || statement3 || ...#!/bin/shrm -f file_oneif [ -f file_one ] || echo “hello” || echo “ there”thenecho “in if”elseecho “in else”fiexit 0

28

Page 82: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Functionsfunction_name () {statements}-------------------------------------------------------------#!/bin/shfoo() {echo “Function foo is executing”}echo “script starting”fooecho “script ended”exit 0

function_name () {statements}-------------------------------------------------------------#!/bin/shfoo() {echo “Function foo is executing”}echo “script starting”fooecho “script ended”exit 0 29

Page 83: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

break#!/bin/shrm -rf fred*echo > fred1echo > fred2mkdir fred3echo > fred4for file in fred*doif [ -d “$file” ]; thenbreak;fidoneecho first directory starting fred was $filerm -rf fred*exit 0

#!/bin/shrm -rf fred*echo > fred1echo > fred2mkdir fred3echo > fred4for file in fred*doif [ -d “$file” ]; thenbreak;fidoneecho first directory starting fred was $filerm -rf fred*exit 0 30

Page 84: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The : Command

The colon command is a null command. It’soccasionally useful to simplify the logic ofconditions, being an alias for true. Since it’s built-in, :runs faster than true, though its output is also muchless readable. You may see it used as a condition forwhile loops; while : implements an infinite loop inplace of the more common while true. The : constructis also useful in the conditional setting of variables.For example,

: ${var:=value} Without the :, the shell would try toevaluate $var as a command.

The colon command is a null command. It’soccasionally useful to simplify the logic ofconditions, being an alias for true. Since it’s built-in, :runs faster than true, though its output is also muchless readable. You may see it used as a condition forwhile loops; while : implements an infinite loop inplace of the more common while true. The : constructis also useful in the conditional setting of variables.For example,

: ${var:=value} Without the :, the shell would try toevaluate $var as a command.

31

Page 85: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Exam…

#!/bin/shrm -f fredif [ -f fred ]; then:elseecho file fred did not existfiexit 0

#!/bin/shrm -f fredif [ -f fred ]; then:elseecho file fred did not existfiexit 0

32

Page 86: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

continue

Rather like the C statement of the same name, thiscommand makes the enclosing for, while, or untilloop continue at the next iteration, with the loopvariable taking the next value in the list:

Rather like the C statement of the same name, thiscommand makes the enclosing for, while, or untilloop continue at the next iteration, with the loopvariable taking the next value in the list:

33

Page 87: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

continue

#!/bin/shrm -rf fred*echo > fred1echo > fred2mkdir fred3echo > fred4

for file in fred*doif [ -d “$file” ]; thenecho “skipping directory $file”continuefiecho file is $filedonerm -rf fred*exit 0

#!/bin/shrm -rf fred*echo > fred1echo > fred2mkdir fred3echo > fred4

for file in fred*doif [ -d “$file” ]; thenecho “skipping directory $file”continuefiecho file is $filedonerm -rf fred*exit 0

34

Page 88: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The . Command

The dot (.) command executes the command inthe current shell:

. ./shell_script#!/bin/shversion=classicPATH=/usr/local/old_bin:/usr/bin:/bin:.PS1=”classic> “

The dot (.) command executes the command inthe current shell:

. ./shell_script#!/bin/shversion=classicPATH=/usr/local/old_bin:/usr/bin:/bin:.PS1=”classic> “

35

Page 89: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

echo

Despite the X/Open exhortation to use the printfcommand in modern shells, we’ve been followingcommon practice by using the echo command tooutput a string followed by a newline character.

echo -n “string to output” echo -e “string to output\c”

Despite the X/Open exhortation to use the printfcommand in modern shells, we’ve been followingcommon practice by using the echo command tooutput a string followed by a newline character.

echo -n “string to output” echo -e “string to output\c”

36

Page 90: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

eval

The eval commandenables you to evaluatearguments. It’s built intothe shell and doesn’tnormally exist as aseparate command. It’sprobably bestdemonstrated with a shortexample borrowed fromthe X/Open specificationitself:

foo=10x=fooy=’$’$xecho $y

foo=10x=foo

eval y=’$’$xecho $y

The eval commandenables you to evaluatearguments. It’s built intothe shell and doesn’tnormally exist as aseparate command. It’sprobably bestdemonstrated with a shortexample borrowed fromthe X/Open specificationitself:

foo=10x=fooy=’$’$xecho $y

foo=10x=foo

eval y=’$’$xecho $y

37

Page 91: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

exec

The exec command has two different uses. Its typical useis to replace the current shell with a different program.For example,

exec wall “Thanks for all the fish” in a script will replace the current shell with the wall

command. The second use of exec is to modify the current file

descriptors: exec 3< afile This causes file descriptor three to be opened for reading

from file afile.

The exec command has two different uses. Its typical useis to replace the current shell with a different program.For example,

exec wall “Thanks for all the fish” in a script will replace the current shell with the wall

command. The second use of exec is to modify the current file

descriptors: exec 3< afile This causes file descriptor three to be opened for reading

from file afile.38

Page 92: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

exit n

In shell script programming, exitcode 0 is success, and codes 1through 125, inclusive, are errorcodes that can be used by scripts.

39

Page 93: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

export

The export command makes the variable named as itsparameter available in subshells. By default,variables created in a shell are not available in further(sub)shells invoked from that shell. The exportcommand creates an environment variable from itsparameter that can be seen by other scripts andprograms invoked from the current program. Moretechnically, the exported variables form theenvironment variables in any child processes derivedfrom the shell. This is best illustrated with anexample of two scripts, export1 and export2.

The export command makes the variable named as itsparameter available in subshells. By default,variables created in a shell are not available in further(sub)shells invoked from that shell. The exportcommand creates an environment variable from itsparameter that can be seen by other scripts andprograms invoked from the current program. Moretechnically, the exported variables form theenvironment variables in any child processes derivedfrom the shell. This is best illustrated with anexample of two scripts, export1 and export2.

40

Page 94: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Exam…

First, list export2:#!/bin/shecho “$foo”echo “$bar”

Now for export1. At the endof this script, invoke export2

#!/bin/shfoo=”The first meta-syntactic

variable”export bar=”The second

meta-syntactic variable”export2 ./export1

First, list export2:#!/bin/shecho “$foo”echo “$bar”

Now for export1. At the endof this script, invoke export2

#!/bin/shfoo=”The first meta-syntactic

variable”export bar=”The second

meta-syntactic variable”export2 ./export1

41

Page 95: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

expr

The expr command evaluates its arguments as anexpression. It’s most commonly used for simplearithmetic in the following form:

x=`expr $x + 1`

The expr command evaluates its arguments as anexpression. It’s most commonly used for simplearithmetic in the following form:

x=`expr $x + 1`

42

Page 96: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

43

Page 97: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

printf

The syntax is printf “format string“ parameter1 parameter2

...

The syntax is printf “format string“ parameter1 parameter2

...

44

Page 98: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

$ printf “%s\n” hellohello$ printf “%s %d\t%s” “Hi There” 15 peopleHi There 15 people

45

Page 99: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

return

The return command causes functions to return,as mentioned when we looked at functions earlier.return takes a single numeric parameter that isavailable to the script calling the function. If noparameter is specified, then return defaults to theexit code of the last command.

The return command causes functions to return,as mentioned when we looked at functions earlier.return takes a single numeric parameter that isavailable to the script calling the function. If noparameter is specified, then return defaults to theexit code of the last command.

46

Page 100: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

set

The set command sets the parameter variables forthe shell. It can be a useful way of using fields incommands that output space-separated values.

#!/bin/shecho the date is $(date)set $(date)echo The month is $2exit 0

The set command sets the parameter variables forthe shell. It can be a useful way of using fields incommands that output space-separated values.

#!/bin/shecho the date is $(date)set $(date)echo The month is $2exit 0

47

Page 101: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

shift

The shift command moves all the parametervariables down by one, so that $2 becomes $1, $3becomes $2, and so on. The previous value of $1is discarded, while $0 remains unchanged. If anumerical parameter is specified in the call toshift, the parameters move that many spaces. Theother variables, $*, $@, and $#, are also modifiedin line with the new arrangement of parametervariables.

The shift command moves all the parametervariables down by one, so that $2 becomes $1, $3becomes $2, and so on. The previous value of $1is discarded, while $0 remains unchanged. If anumerical parameter is specified in the call toshift, the parameters move that many spaces. Theother variables, $*, $@, and $#, are also modifiedin line with the new arrangement of parametervariables.

48

Page 102: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

shift

shift is often useful forscanning throughparameters passed into ascript, and if your scriptrequires 10 or moreparameters, you’ll needshift to access the tenthand beyond.

#!/bin/shwhile [ “$1” != “” ]; doecho “$1”shiftdoneexit 0

shift is often useful forscanning throughparameters passed into ascript, and if your scriptrequires 10 or moreparameters, you’ll needshift to access the tenthand beyond.

#!/bin/shwhile [ “$1” != “” ]; doecho “$1”shiftdoneexit 0

49

Page 103: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

trap

The trap command is used to specify the actions to takeon receipt of signals, which you’ll meet in more detaillater in the book. A common use is to tidy up a scriptwhen it is interrupted.

trap command signal

The trap command is used to specify the actions to takeon receipt of signals, which you’ll meet in more detaillater in the book. A common use is to tidy up a scriptwhen it is interrupted.

trap command signal

50

Page 104: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

unset

The unset command removes variables orfunctions from the environment. It can’t do this toread-only variables defined by the shell itself,such as IFS. It’s not often used.

#!/bin/shfoo=”Hello World”echo $foounset fooecho $foo

The unset command removes variables orfunctions from the environment. It can’t do this toread-only variables defined by the shell itself,such as IFS. It’s not often used.

#!/bin/shfoo=”Hello World”echo $foounset fooecho $foo

51

Page 105: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The find Command

find / -name test –print The grep Command find / -name test –print The grep Command

52

Page 106: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Debugging Scripts

53

Page 107: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Going Graphical — The dialog Utility

The whole idea of dialog is beautifully simple — asingle program with a variety of parameters andoptions that allows you to display various types ofgraphical boxes, ranging from simple Yes/No boxesto input boxes and even menu selections. The utilitygenerally returns when the user has made some sortof input, and the result can be found either from theexit status or if text was entered by retrieving thestandard error stream.

dialog --msgbox “Hello World” 9 18

The whole idea of dialog is beautifully simple — asingle program with a variety of parameters andoptions that allows you to display various types ofgraphical boxes, ranging from simple Yes/No boxesto input boxes and even menu selections. The utilitygenerally returns when the user has made some sortof input, and the result can be found either from theexit status or if text was entered by retrieving thestandard error stream.

dialog --msgbox “Hello World” 9 18

54

Page 108: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

dialog

55

Page 109: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

56

Page 110: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Working with Files

Page 111: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Contents1. ❑ Files and devices2. ❑ System calls3. ❑ Library functions4. ❑ Low-level file access5. ❑Managing files6. ❑ The standard I/O library7. ❑ Formatted input and output8. ❑ File and directory maintenance9. ❑ Scanning directories10. ❑ Errors11. ❑ The /proc file system12. ❑ Advanced topics: fcntl and mmap

1. ❑ Files and devices2. ❑ System calls3. ❑ Library functions4. ❑ Low-level file access5. ❑Managing files6. ❑ The standard I/O library7. ❑ Formatted input and output8. ❑ File and directory maintenance9. ❑ Scanning directories10. ❑ Errors11. ❑ The /proc file system12. ❑ Advanced topics: fcntl and mmap

2

Page 112: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Directories

3

Page 113: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Files and Devices

# mount -t iso9660 /dev/hdc /mnt/cdrom # cd /mnt/cdrom

4

Page 114: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

System Calls and Device Drivers

The low-level functions used to access the devicedrivers, the system calls, include:❑ open: Open a file or device❑ read: Read from an open file or device❑ write: Write to a file or device❑ close: Close the file or device❑ ioctl: Pass control information to a device driver

The low-level functions used to access the devicedrivers, the system calls, include:❑ open: Open a file or device❑ read: Read from an open file or device❑ write: Write to a file or device❑ close: Close the file or device❑ ioctl: Pass control information to a device driver

5

Page 115: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Library Functions

6

Page 116: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Low-Level File Access

Each running program, called a process, has a numberof file descriptors associated with it. These are smallintegers that you can use to access open files ordevices. How many of these are available will varydepending on how the system has been configured.When a program starts, it usually has three of thesedescriptors already opened. These are:❑ 0: Standard input❑ 1: Standard output❑ 2: Standard error

Each running program, called a process, has a numberof file descriptors associated with it. These are smallintegers that you can use to access open files ordevices. How many of these are available will varydepending on how the system has been configured.When a program starts, it usually has three of thesedescriptors already opened. These are:❑ 0: Standard input❑ 1: Standard output❑ 2: Standard error

7

Page 117: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

write

#include <unistd.h> size_t write(int fildes, const void *buf, size_t nbytes); #include <unistd.h> size_t write(int fildes, const void *buf, size_t nbytes);

8

Page 118: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

write

The write system call arranges for the first nbytesbytes from buf to be written to the file associatedwith the file descriptor fildes. It returns thenumber of bytes actually written. This may be lessthan nbytes if there has been an error in the filedescriptor or if the underlying device driver issensitive to block size. If the function returns 0, itmeans no data was written; if it returns –1, therehas been an error in the write call, and the errorwill be specified in the errno global variable.

The write system call arranges for the first nbytesbytes from buf to be written to the file associatedwith the file descriptor fildes. It returns thenumber of bytes actually written. This may be lessthan nbytes if there has been an error in the filedescriptor or if the underlying device driver issensitive to block size. If the function returns 0, itmeans no data was written; if it returns –1, therehas been an error in the write call, and the errorwill be specified in the errno global variable.

9

Page 119: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

read The read system call reads up to nbytes bytes of

data from the file associated with the filedescriptor fildes and places them in the data areabuf. It returns the number of data bytes actuallyread, which may be less than the numberrequested. If a read call returns 0, it had nothingto read; it reached the end of the file. Again, anerror on the call will cause it to return –1.

#include <unistd.h> size_t read(int fildes, void *buf, size_t nbytes);

The read system call reads up to nbytes bytes ofdata from the file associated with the filedescriptor fildes and places them in the data areabuf. It returns the number of data bytes actuallyread, which may be less than the numberrequested. If a read call returns 0, it had nothingto read; it reached the end of the file. Again, anerror on the call will cause it to return –1.

#include <unistd.h> size_t read(int fildes, void *buf, size_t nbytes);

10

Page 120: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

11

Page 121: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

open

To create a new file descriptor, you need to usethe open system call.

#include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int open(const char *path, int oflags); int open(const char *path, int oflags, mode_t mode);

To create a new file descriptor, you need to usethe open system call.

#include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int open(const char *path, int oflags); int open(const char *path, int oflags, mode_t mode);

12

Page 122: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

13

Page 123: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

umask

The umask is a system variable that encodes amask for file permissions to be used when a file iscreated. You can change the variable by executingthe umask command to supply a new value. Thevalue is a three-digit octal value. Each digit is theresult of ORing values from 1, 2, or 4; themeanings are shown in the following table. Theseparate digits refer to “user,” “group,” and“other” permissions, respectively.

The umask is a system variable that encodes amask for file permissions to be used when a file iscreated. You can change the variable by executingthe umask command to supply a new value. Thevalue is a three-digit octal value. Each digit is theresult of ORing values from 1, 2, or 4; themeanings are shown in the following table. Theseparate digits refer to “user,” “group,” and“other” permissions, respectively.

14

Page 124: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

15

Page 125: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

For example, to block “group” write and execute,and “other” write, the umask would be - 032

16

Page 126: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

close

You use close to terminate the associationbetween a file descriptor, fildes, and its file. Thefile descriptor becomes available for reuse. Itreturns 0 if successful and –1 on error.

#include <unistd.h> int close(int fildes);

You use close to terminate the associationbetween a file descriptor, fildes, and its file. Thefile descriptor becomes available for reuse. Itreturns 0 if successful and –1 on error.

#include <unistd.h> int close(int fildes);

17

Page 127: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

copy_system.c#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>int main(){

char c;int in, out;in = open(“file.in”, O_RDONLY);out = open(“file.out”, O_WRONLY|O_CREAT,

S_IRUSR|S_IWUSR);while(read(in,&c,1) == 1)write(out,&c,1);exit(0);

}

#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>int main(){

char c;int in, out;in = open(“file.in”, O_RDONLY);out = open(“file.out”, O_WRONLY|O_CREAT,

S_IRUSR|S_IWUSR);while(read(in,&c,1) == 1)write(out,&c,1);exit(0);

}18

Page 128: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Other System Calls for Managing Files

lseek fstat, stat, and lstat dup and dup2

19

Page 129: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The Standard I/O Library❑ fopen, fclose❑ fread, fwrite❑ fflush❑ fseek❑ fgetc, getc, getchar❑ fputc, putc, putchar❑ fgets, gets❑ printf, fprintf, and sprintf❑ scanf, fscanf, and sscanf

❑ fopen, fclose❑ fread, fwrite❑ fflush❑ fseek❑ fgetc, getc, getchar❑ fputc, putc, putchar❑ fgets, gets❑ printf, fprintf, and sprintf❑ scanf, fscanf, and sscanf

20

Page 130: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

fopen

#include <stdio.h> FILE *fopen(const char *filename, const char

*mode);

21

Page 131: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

fread, fwrite

#include <stdio.h> size_t fread(void *ptr, size_t size, size_t nitems,

FILE *stream);

#include <stdio.h> size_t fread(void *ptr, size_t size, size_t nitems,

FILE *stream);

#include <stdio.h> size_t fread(void *ptr, size_t size, size_t nitems,

FILE *stream);

#include <stdio.h> size_t fread(void *ptr, size_t size, size_t nitems,

FILE *stream);

22

Page 132: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

fwrite, fclose, fflush

#include <stdio.h> size_t fwrite (const void *ptr, size_t size, size_t

nitems, FILE *stream);

#include <stdio.h> int fclose(FILE *stream);

#include <stdio.h> int fflush(FILE *stream);

#include <stdio.h> size_t fwrite (const void *ptr, size_t size, size_t

nitems, FILE *stream);

#include <stdio.h> int fclose(FILE *stream);

#include <stdio.h> int fflush(FILE *stream);

23

Page 133: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

fgetc, getc, and getchar

#include <stdio.h> int fgetc(FILE *stream); int getc(FILE *stream); int getchar();

#include <stdio.h> int fgetc(FILE *stream); int getc(FILE *stream); int getchar();

24

Page 134: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

fputc, putc, and putchar

#include <stdio.h> int fputc(int c, FILE *stream); int putc(int c, FILE *stream); int putchar(int c);

#include <stdio.h> int fputc(int c, FILE *stream); int putc(int c, FILE *stream); int putchar(int c);

25

Page 135: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

fgets and gets

#include <stdio.h> char *fgets(char *s, int n, FILE *stream); char *gets(char *s);

26

Page 136: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Formatted Input and Output

#include <stdio.h> int printf(const char *format, ...); int sprintf(char *s, const char *format, ...); int fprintf(FILE *stream, const char *format, ...);

int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *s, const char *format, ...);

#include <stdio.h> int printf(const char *format, ...); int sprintf(char *s, const char *format, ...); int fprintf(FILE *stream, const char *format, ...);

int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *s, const char *format, ...);

27

Page 137: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Stream Errors

#include <errno.h> extern int errno;

#include <stdio.h> int ferror(FILE *stream); int feof(FILE *stream); void clearerr(FILE *stream);

#include <errno.h> extern int errno;

#include <stdio.h> int ferror(FILE *stream); int feof(FILE *stream); void clearerr(FILE *stream);

28

Page 138: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

File and Directory Maintenance

chmod#include <sys/stat.h>int chmod(const char *path, mode_t mode);

chown#include <sys/types.h>#include <unistd.h>int chown(const char *path, uid_t owner, gid_t group);

chmod#include <sys/stat.h>int chmod(const char *path, mode_t mode);

chown#include <sys/types.h>#include <unistd.h>int chown(const char *path, uid_t owner, gid_t group);

29

Page 139: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

int unlink(const char *path); int link(const char *path1, const char *path2); int symlink(const char *path1, const char *path2); int mkdir(const char *path, mode_t mode); int rmdir(const char *path); int chdir(const char *path); char *getcwd(char *buf, size_t size);

int unlink(const char *path); int link(const char *path1, const char *path2); int symlink(const char *path1, const char *path2); int mkdir(const char *path, mode_t mode); int rmdir(const char *path); int chdir(const char *path); char *getcwd(char *buf, size_t size);

30

Page 140: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The /proc File System

cat /proc/cpuinfo cat /proc/meminfo cat /proc/version cat /proc/net/sockstat cat /proc/sys/fs/file-max

cat /proc/cpuinfo cat /proc/meminfo cat /proc/version cat /proc/net/sockstat cat /proc/sys/fs/file-max

31

Page 141: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Programming KDE Using Qt

Page 142: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Contents

❑ An introduction to Qt❑ Installing Qt❑ Getting started❑ Signal/slot mechanism❑ Qt widgets❑ Dialogs❑Menus and toolbars with KDE❑ Building your CD database application with KDE/Qt

❑ An introduction to Qt❑ Installing Qt❑ Getting started❑ Signal/slot mechanism❑ Qt widgets❑ Dialogs❑Menus and toolbars with KDE❑ Building your CD database application with KDE/Qt

2

Page 143: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Introducing KDE and Qt

KDE (K Desktop Environment) is an open sourcedesktop environment based on the Qt GUI library.A host of applications and utilities are part ofKDE, including a complete office suite, a Webbrowser, and even a fully featured IDE forprogramming KDE/Qt applications.

KDE (K Desktop Environment) is an open sourcedesktop environment based on the Qt GUI library.A host of applications and utilities are part ofKDE, including a complete office suite, a Webbrowser, and even a fully featured IDE forprogramming KDE/Qt applications.

3

Page 144: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Qt Qt is a mature, cross-platform GUI toolkit written in C++.

Qt is the brainchild of Trolltech, a Norwegian company thatdevelops, markets, and supports Qt and Qt-related softwarefor the commercial market. Trolltech loudly touts the cross-platform capabilities of Qt, which is undeniably impressive;Qt has native support on Linux and UNIX derivatives,Windows, Mac OS X, and even embedded platforms, whichgives Qt a great competitive advantage over its rivals. Aspecialized version of Qt runs on cell phones. Anotherversion runs on the Sharp Zaurus PDA and similar platform.Qt Jambi provides a Java version of the toolkit. Qt OpenSource Edition is licensed under the GPL.

Qt is a mature, cross-platform GUI toolkit written in C++.Qt is the brainchild of Trolltech, a Norwegian company thatdevelops, markets, and supports Qt and Qt-related softwarefor the commercial market. Trolltech loudly touts the cross-platform capabilities of Qt, which is undeniably impressive;Qt has native support on Linux and UNIX derivatives,Windows, Mac OS X, and even embedded platforms, whichgives Qt a great competitive advantage over its rivals. Aspecialized version of Qt runs on cell phones. Anotherversion runs on the Sharp Zaurus PDA and similar platform.Qt Jambi provides a Java version of the toolkit. Qt OpenSource Edition is licensed under the GPL.

4

Page 145: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

QMainWindow

//file qt1.cpp

5

Page 146: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

To compile, you’ll need to include the Qt includeand lib directories:

$ g++ -o qt1 qt1.cpp –I$QTDIR/include –L$QTDIR/lib –lqui

$ ./qt1

To compile, you’ll need to include the Qt includeand lib directories:

$ g++ -o qt1 qt1.cpp –I$QTDIR/include –L$QTDIR/lib –lqui

$ ./qt1

6

Page 147: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Signals and Slots

Signals and signal handling are the primarymechanisms a GUI application uses to respond touser input and are central features of all GUIlibraries. Qt’s signal-handling mechanism consistsof signals and slots, which are Qt’s names forsignals and callback functions in GTK+ or Javaevents and event handlers.

Signals and signal handling are the primarymechanisms a GUI application uses to respond touser input and are central features of all GUIlibraries. Qt’s signal-handling mechanism consistsof signals and slots, which are Qt’s names forsignals and callback functions in GTK+ or Javaevents and event handlers.

7

Page 148: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Qt

Here’s a reminder of how event-driven programmingworks: A GUI consists of menus, toolbars, buttons, entryboxes, and many other GUI elements that are collectivelyknown as widgets. When the user inter-acts with a widget,for example activating a menu item or entering some text inan entry box, the widget will emit a named signal such asclicked, text_changed, or key_pressed. You’ll usually wantto do something in response to the user’s action, such assave a document or quit the application, and you do this byconnecting a signal to a callback function or, in Qt parlance,a slot.

Here’s a reminder of how event-driven programmingworks: A GUI consists of menus, toolbars, buttons, entryboxes, and many other GUI elements that are collectivelyknown as widgets. When the user inter-acts with a widget,for example activating a menu item or entering some text inan entry box, the widget will emit a named signal such asclicked, text_changed, or key_pressed. You’ll usually wantto do something in response to the user’s action, such assave a document or quit the application, and you do this byconnecting a signal to a callback function or, in Qt parlance,a slot.

8

Page 149: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

A typical class definition MyWindow.h for yourGUI will look something like this:

emit aSignal();

9

emit aSignal();

Page 150: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Qt …

To use slots, you must connect them to a signal.You do this with the appropriately named staticconnect method in the QObject class:

bool QObject::connect (const QObject *sender, const char * signal, const QObject *receiver, const char * member)

To use slots, you must connect them to a signal.You do this with the appropriately named staticconnect method in the QObject class:

bool QObject::connect (const QObject *sender, const char * signal, const QObject *receiver, const char * member)

10

Page 151: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Qt …

In the MyWindow example, if you wanted toconnect the clicked signal of a QPushButtonwidget to your doSomething slot, you’d writeconnect (button, SIGNAL(clicked()), this,SLOT(doSomething()));

void MyWindow::doSomething(){// Slot code}

In the MyWindow example, if you wanted toconnect the clicked signal of a QPushButtonwidget to your doSomething slot, you’d writeconnect (button, SIGNAL(clicked()), this,SLOT(doSomething()));

void MyWindow::doSomething(){// Slot code}

11

Page 152: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Exam. Extend QMainWindow and add a button,and connect the button’s clicked signal to a slot.

12

Page 153: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Exam. (cont.)

13

Page 154: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Qt (cont.)

14

Page 155: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Qt. (cont.)

15

Page 156: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Before you can compile this example, you need to run thepreprocessor on the header file. This preprocessorprogram is called the Meta Object Compiler (moc) andshould be present in the Qt package. Run moc onButtonWindow.h, saving the output asButtonWindow.moc:

$ moc ButtonWindow.h –o ButtonWindow.moc Now you can compile as usual, linking in the moc output: $ g++ -o button ButtonWindow.cpp –

I$QTDIR/include –L$QTDIR/lib –lqui

16

Before you can compile this example, you need to run thepreprocessor on the header file. This preprocessorprogram is called the Meta Object Compiler (moc) andshould be present in the Qt package. Run moc onButtonWindow.h, saving the output asButtonWindow.moc:

$ moc ButtonWindow.h –o ButtonWindow.moc Now you can compile as usual, linking in the moc output: $ g++ -o button ButtonWindow.cpp –

I$QTDIR/include –L$QTDIR/lib –lqui

Page 157: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

QVBoxLayout(…has an identical API)

QVBoxLayout::QVBoxLayout (QWidget *parent, int margin,int spacing, const char *name)

QVBoxLayout::QVBoxLayout (QLayout *parentLayout, intspacing, const char * name)

QVBoxLayout::QVBoxLayout (int spacing, const char *name) Once you’ve created your QLayout, you add child widgets or

layouts using a couple of methods: QBoxLayout::addWidget (QWidget *widget, int stretch = 0, int

alignment = 0 ) QBoxLayout::addLayout (QLayout *layout, int stretch = 0)

QVBoxLayout::QVBoxLayout (QWidget *parent, int margin,int spacing, const char *name)

QVBoxLayout::QVBoxLayout (QLayout *parentLayout, intspacing, const char * name)

QVBoxLayout::QVBoxLayout (int spacing, const char *name) Once you’ve created your QLayout, you add child widgets or

layouts using a couple of methods: QBoxLayout::addWidget (QWidget *widget, int stretch = 0, int

alignment = 0 ) QBoxLayout::addLayout (QLayout *layout, int stretch = 0)

17

Page 158: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Example: Using QBoxLayout Classes

1. First, enter the header file, LayoutWindow.h:#include <qmainwindow.h>class LayoutWindow : public QMainWindow{Q_OBJECTpublic:LayoutWindow(QWidget *parent = 0, const char *name = 0);virtual ~LayoutWindow();};

1. First, enter the header file, LayoutWindow.h:#include <qmainwindow.h>class LayoutWindow : public QMainWindow{Q_OBJECTpublic:LayoutWindow(QWidget *parent = 0, const char *name = 0);virtual ~LayoutWindow();};

18

Page 159: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

2. Now enter the implementation,LayoutWindow.cpp:#include <qapplication.h>#include <qlabel.h>#include <qlayout.h>#include “LayoutWindow.moc”LayoutWindow::LayoutWindow(QWidget *parent,

const char *name) : QMainWindow(parent, name){this->setCaption(“Layouts”);

#include <qapplication.h>#include <qlabel.h>#include <qlayout.h>#include “LayoutWindow.moc”LayoutWindow::LayoutWindow(QWidget *parent,

const char *name) : QMainWindow(parent, name){this->setCaption(“Layouts”);

19

Page 160: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

3. You need to create a dummy QWidget to hold your QHBoxLayoutbecause you cannot add a QLayout directly to a QMainWindow:

QWidget *widget = new QWidget(this);setCentralWidget(widget);QHBoxLayout *horizontal = new QHBoxLayout(widget, 5, 10, “horizontal”);QVBoxLayout *vertical = new QVBoxLayout();QLabel* label1 = new QLabel(“Top”, widget, “textLabel1” );QLabel* label2 = new QLabel(“Bottom”, widget, “textLabel2”);QLabel* label3 = new QLabel(“Right”, widget, “textLabel3”);vertical->addWidget(label1);vertical->addWidget(label2);horizontal->addLayout(vertical);horizontal->addWidget(label3);resize( 150, 100 );}

QWidget *widget = new QWidget(this);setCentralWidget(widget);QHBoxLayout *horizontal = new QHBoxLayout(widget, 5, 10, “horizontal”);QVBoxLayout *vertical = new QVBoxLayout();QLabel* label1 = new QLabel(“Top”, widget, “textLabel1” );QLabel* label2 = new QLabel(“Bottom”, widget, “textLabel2”);QLabel* label3 = new QLabel(“Right”, widget, “textLabel3”);vertical->addWidget(label1);vertical->addWidget(label2);horizontal->addLayout(vertical);horizontal->addWidget(label3);resize( 150, 100 );}

20

Page 161: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Cont.

LayoutWindow::~LayoutWindow(){}int main(int argc, char **argv){

QApplication app(argc,argv);LayoutWindow *window = new LayoutWindow();app.setMainWidget(window);window->show();return app.exec();

}

LayoutWindow::~LayoutWindow(){}int main(int argc, char **argv){

QApplication app(argc,argv);LayoutWindow *window = new LayoutWindow();app.setMainWidget(window);window->show();return app.exec();

}21

Page 162: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Run …

$ moc LayoutWindow.h –o LayoutWindow.moc $ g++ -o layout LayoutWindow.cpp –

I$QTDIR/include –L$QTDIR/lib –lqui

22

Page 163: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

QLineEdit

QLineEdit is Qt’s single-line text entry widget. Use itfor inputting brief amounts of text, such as a user’sfirst name. With a QLineEdit widget, you can limittext input using an input mask to fit a template or, forthe ultimate control, you can apply a validatorfunction, for example, to ensure the user enters aproper date, phone number, or other similar value.QLineEdit has editing features, enabling you to selectparts of the text, cut and paste, undo, redo, and thelike from both a user’s perspective and using the API.

QLineEdit is Qt’s single-line text entry widget. Use itfor inputting brief amounts of text, such as a user’sfirst name. With a QLineEdit widget, you can limittext input using an input mask to fit a template or, forthe ultimate control, you can apply a validatorfunction, for example, to ensure the user enters aproper date, phone number, or other similar value.QLineEdit has editing features, enabling you to selectparts of the text, cut and paste, undo, redo, and thelike from both a user’s perspective and using the API.

23

Page 164: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

The constructors and most useful methods are

#include <qlineedit.h> QLineEdit::QlineEdit (QWidget *parent, const char* name = 0 ) QLineEdit::QLineEdit (const QString &contents, QWidget

*parent, const char *name = 0 ) QLineEdit::QLineEdit (const QString &contents, const QString

&inputMask, QWidget *parent, const char *name = 0 ) void setInputMask (const QString &inputMask) void insert (const QString &newText ) bool isModified (void)

#include <qlineedit.h> QLineEdit::QlineEdit (QWidget *parent, const char* name = 0 ) QLineEdit::QLineEdit (const QString &contents, QWidget

*parent, const char *name = 0 ) QLineEdit::QLineEdit (const QString &contents, const QString

&inputMask, QWidget *parent, const char *name = 0 ) void setInputMask (const QString &inputMask) void insert (const QString &newText ) bool isModified (void)

24

Page 165: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

void setMaxLength (int length) void setReadOnly (bool read) void setText (const QString &text) QString text (void) void setEchoMode(EchoMode mode)

void setMaxLength (int length) void setReadOnly (bool read) void setText (const QString &text) QString text (void) void setEchoMode(EchoMode mode)

25

Page 166: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

EchoMode

It can take one of three values:❑ QLineEdit::Normal: Display inputted characters

(default)❑ QLineEdit::Password: Display asterisks in place

of characters❑ QLineEdit::NoEcho: Display nothing Set the mode using the setEchoMode: lineEdit->setEchoMode(QLineEdit::Password);

It can take one of three values:❑ QLineEdit::Normal: Display inputted characters

(default)❑ QLineEdit::Password: Display asterisks in place

of characters❑ QLineEdit::NoEcho: Display nothing Set the mode using the setEchoMode: lineEdit->setEchoMode(QLineEdit::Password);

26

Page 167: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

inputMask is a string made up of characters, each of whichcorresponds to a rule that accepts a certain range of characters

27

Page 168: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Example. QLineEdit

28

Page 169: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

29

Page 170: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

30

Page 171: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Step3. Cont.

31

Page 172: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Qt Buttons

QButton: The Button Base Class #include <qbutton.h> virtual void QButton::setText ( const QString & ) virtual void QButton::setPixmap ( const QPixmap & ) bool QButton::isToggleButton () const virtual void QButton::setDown ( bool ) bool QButton::isDown () const bool QButton::isOn () const enum QButton::ToggleState { Off, NoChange, On } ToggleState QButton::state () const

QButton: The Button Base Class #include <qbutton.h> virtual void QButton::setText ( const QString & ) virtual void QButton::setPixmap ( const QPixmap & ) bool QButton::isToggleButton () const virtual void QButton::setDown ( bool ) bool QButton::isDown () const bool QButton::isOn () const enum QButton::ToggleState { Off, NoChange, On } ToggleState QButton::state () const

32

Page 173: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

QPushButton

QPushButton is the standard generic button that containstext such as “OK” or “Cancel” and/or a pixmap icon. Likeall QButtons, it emits the clicked signal when it’sactivated, and is usually used to connect a slot andperform some action.

#include <qpushbutton.h> QPushButton (QWidget *parent, const char *name = 0) QPushButton (const QString &text, QWidget *parent, const

char *name = 0) QPushButton (const QIconSet &icon, const QString &text, QWidget *parent, const char * name = 0 ) void QPushButton::setToggleButton (bool);

QPushButton is the standard generic button that containstext such as “OK” or “Cancel” and/or a pixmap icon. Likeall QButtons, it emits the clicked signal when it’sactivated, and is usually used to connect a slot andperform some action.

#include <qpushbutton.h> QPushButton (QWidget *parent, const char *name = 0) QPushButton (const QString &text, QWidget *parent, const

char *name = 0) QPushButton (const QIconSet &icon, const QString &text, QWidget *parent, const char * name = 0 ) void QPushButton::setToggleButton (bool);

33

Page 174: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

QCheckBox

QCheckBox is a button that has state; that is, it can be turnedon or off. The appearance of QCheckBox depends on thecurrent windowing style (Motif, Windows, and so on) but isusually drawn as a ticked box with text to the right.

#include <qcheckbox.h> QCheckBox (QWidget *parent, const char *name = 0 ) QCheckBox (const QString &text, QWidget *parent,

const char *name = 0 ) bool QCheckBox::isChecked () void QCheckBox::setTristate ( bool y = TRUE ) bool QCheckBox::isTristate ()

QCheckBox is a button that has state; that is, it can be turnedon or off. The appearance of QCheckBox depends on thecurrent windowing style (Motif, Windows, and so on) but isusually drawn as a ticked box with text to the right.

#include <qcheckbox.h> QCheckBox (QWidget *parent, const char *name = 0 ) QCheckBox (const QString &text, QWidget *parent,

const char *name = 0 ) bool QCheckBox::isChecked () void QCheckBox::setTristate ( bool y = TRUE ) bool QCheckBox::isTristate ()

34

Page 175: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

QRadioButton Radio buttons are toggle buttons used to represent exclusive choices

when you can select only one option out of a group of optionspresented (think back to those old car radios, where only one stationbutton could be pressed in at a time)

#include <qbuttongroup.h> QButtonGroup (QWidget *parent = 0, const char * name = 0 ) QButtonGroup (const QString & title, QWidget * parent = 0,

const char * name = 0 ) int insert (QButton *button, int id = -1) void remove (QButton *button) int id (QButton *button) const int count () const int selectedId () const

Radio buttons are toggle buttons used to represent exclusive choiceswhen you can select only one option out of a group of optionspresented (think back to those old car radios, where only one stationbutton could be pressed in at a time)

#include <qbuttongroup.h> QButtonGroup (QWidget *parent = 0, const char * name = 0 ) QButtonGroup (const QString & title, QWidget * parent = 0,

const char * name = 0 ) int insert (QButton *button, int id = -1) void remove (QButton *button) int id (QButton *button) const int count () const int selectedId () const

35

Page 176: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

QRadioButton

The QRadioButton constructors and one uniquemethod shouldn’t be too surprising:

#include <qradiobutton.h> QRadioButton (QWidget *parent, const char *name = 0 ) QRadioButton (const QString &text, QWidget *parent,

const char *name = 0 ) bool QRadioButton::isChecked ()

The QRadioButton constructors and one uniquemethod shouldn’t be too surprising:

#include <qradiobutton.h> QRadioButton (QWidget *parent, const char *name = 0 ) QRadioButton (const QString &text, QWidget *parent,

const char *name = 0 ) bool QRadioButton::isChecked ()

36

Page 177: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Example. QButtons

1. Enter Buttons.h:#include <qmainwindow.h>#include <qcheckbox.h>#include <qbutton.h>#include <qradiobutton.h>class Buttons : public QMainWindow{Q_OBJECTpublic:Buttons(QWidget *parent = 0, const char *name = 0);

1. Enter Buttons.h:#include <qmainwindow.h>#include <qcheckbox.h>#include <qbutton.h>#include <qradiobutton.h>class Buttons : public QMainWindow{Q_OBJECTpublic:Buttons(QWidget *parent = 0, const char *name = 0);

37

Page 178: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

2. You’ll query the state of your buttons later in the slotfunction, so declare the button pointers as private in the classdefinition, as well as a helper function PrintActive:

private:void PrintActive(QButton *button);QCheckBox *checkbox;QRadioButton *radiobutton1, *radiobutton2;private slots:void Clicked();};

2. You’ll query the state of your buttons later in the slotfunction, so declare the button pointers as private in the classdefinition, as well as a helper function PrintActive:

private:void PrintActive(QButton *button);QCheckBox *checkbox;QRadioButton *radiobutton1, *radiobutton2;private slots:void Clicked();};

38

Page 179: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

3. Here’s Buttons.cpp:#include “Buttons.moc”#include <qbuttongroup.h>#include <qpushbutton.h>#include <qapplication.h>#include <qlabel.h>#include <qlayout.h>#include <iostream>Buttons::Buttons(QWidget *parent, const char *name) :

QMainWindow(parent, name){QWidget *widget = new QWidget(this);setCentralWidget(widget);QVBoxLayout *vbox = new QVBoxLayout(widget,5, 10,”vbox”);checkbox = new QCheckBox(“CheckButton”, widget, “check”);vbox->addWidget(checkbox);

#include “Buttons.moc”#include <qbuttongroup.h>#include <qpushbutton.h>#include <qapplication.h>#include <qlabel.h>#include <qlayout.h>#include <iostream>Buttons::Buttons(QWidget *parent, const char *name) :

QMainWindow(parent, name){QWidget *widget = new QWidget(this);setCentralWidget(widget);QVBoxLayout *vbox = new QVBoxLayout(widget,5, 10,”vbox”);checkbox = new QCheckBox(“CheckButton”, widget, “check”);vbox->addWidget(checkbox); 39

Page 180: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

4. Here you create a QButtonGroup foryour two radio buttons:QButtonGroup *buttongroup = new QButtonGroup(0);radiobutton1 = new QRadioButton(“RadioButton1”, widget, “radio1”);buttongroup->insert(radiobutton1);vbox->addWidget(radiobutton1);radiobutton2 = new QRadioButton(“RadioButton2”, widget, “radio2”);buttongroup->insert(radiobutton2);vbox->addWidget(radiobutton2);QPushButton *button = new QPushButton (“Ok”, widget, “button”);vbox->addWidget(button);resize( 350, 200 );connect (button, SIGNAL(clicked()), this, SLOT(Clicked()));}

QButtonGroup *buttongroup = new QButtonGroup(0);radiobutton1 = new QRadioButton(“RadioButton1”, widget, “radio1”);buttongroup->insert(radiobutton1);vbox->addWidget(radiobutton1);radiobutton2 = new QRadioButton(“RadioButton2”, widget, “radio2”);buttongroup->insert(radiobutton2);vbox->addWidget(radiobutton2);QPushButton *button = new QPushButton (“Ok”, widget, “button”);vbox->addWidget(button);resize( 350, 200 );connect (button, SIGNAL(clicked()), this, SLOT(Clicked()));}

40

Page 181: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

5. Next is a convenience method for printing thestate of the given QButton:

void Buttons::PrintActive(QButton *button){if (button->isOn())std::cout << button->name() << “ is checked\n”;elsestd::cout << button->name() << “ is not checked\n”;}void Buttons::Clicked(void){PrintActive(checkbox);PrintActive(radiobutton1);PrintActive(radiobutton2);std::cout << “\n”;}

void Buttons::PrintActive(QButton *button){if (button->isOn())std::cout << button->name() << “ is checked\n”;elsestd::cout << button->name() << “ is not checked\n”;}void Buttons::Clicked(void){PrintActive(checkbox);PrintActive(radiobutton1);PrintActive(radiobutton2);std::cout << “\n”;} 41

Page 182: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

QButton

int main(int argc, char **argv){QApplication app(argc,argv);Buttons *window = new Buttons();app.setMainWidget(window);window->show();return app.exec();}

int main(int argc, char **argv){QApplication app(argc,argv);Buttons *window = new Buttons();app.setMainWidget(window);window->show();return app.exec();}

42

Page 183: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

QComboBox

1. Enter the following and name the file ComboBox.h:#include <qmainwindow.h>#include <qcombobox.h>class ComboBox : public QMainWindow{Q_OBJECTpublic:ComboBox(QWidget *parent = 0, const char *name = 0);private slots:void Changed(const QString& s);};

1. Enter the following and name the file ComboBox.h:#include <qmainwindow.h>#include <qcombobox.h>class ComboBox : public QMainWindow{Q_OBJECTpublic:ComboBox(QWidget *parent = 0, const char *name = 0);private slots:void Changed(const QString& s);};

43

Page 184: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

2. The interface consists of two QComboBox widgets, one editable and theother read-only. You populate both widgets with the same list of items:

#include “ComboBox.moc”#include <qlayout.h>#include <iostream>ComboBox::ComboBox(QWidget *parent, const char

*name) : QMainWindow(parent, name){QWidget *widget = new QWidget(this);setCentralWidget(widget);QVBoxLayout *vbox = new QVBoxLayout(widget, 5,

10,”vbox”);

#include “ComboBox.moc”#include <qlayout.h>#include <iostream>ComboBox::ComboBox(QWidget *parent, const char

*name) : QMainWindow(parent, name){QWidget *widget = new QWidget(this);setCentralWidget(widget);QVBoxLayout *vbox = new QVBoxLayout(widget, 5,

10,”vbox”);44

Page 185: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

QComboBox *editablecombo = new QComboBox(TRUE, widget,“editable”);

vbox->addWidget(editablecombo);QComboBox *readonlycombo = new QComboBox(FALSE, widget,

“readonly”);vbox->addWidget(readonlycombo);static const char* items[] = { “Macbeth”, “Twelfth Night”, “Othello”, 0

};editablecombo->insertStrList (items);readonlycombo->insertStrList (items);connect (editablecombo, SIGNAL(textChanged(const QString&)),this, SLOT(Changed(const QString&)));resize( 350, 200 );}

QComboBox *editablecombo = new QComboBox(TRUE, widget,“editable”);

vbox->addWidget(editablecombo);QComboBox *readonlycombo = new QComboBox(FALSE, widget,

“readonly”);vbox->addWidget(readonlycombo);static const char* items[] = { “Macbeth”, “Twelfth Night”, “Othello”, 0

};editablecombo->insertStrList (items);readonlycombo->insertStrList (items);connect (editablecombo, SIGNAL(textChanged(const QString&)),this, SLOT(Changed(const QString&)));resize( 350, 200 );}

45

Page 186: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

3. This is the slot function. Note the QStringparameter s that’s passed by the signal:

void ComboBox::Changed(const QString& s){std::cout << s << “\n”;}int main(int argc, char **argv){QApplication app(argc,argv);ComboBox *window = new ComboBox();app.setMainWidget(window);window->show();return app.exec();}

void ComboBox::Changed(const QString& s){std::cout << s << “\n”;}int main(int argc, char **argv){QApplication app(argc,argv);ComboBox *window = new ComboBox();app.setMainWidget(window);window->show();return app.exec();}

46

Page 187: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

QListView

Lists and trees in Qt are provided by the QListViewwidget. QListView displays both plain lists andhierarchical data divided into rows and columns. It’sperfect for displaying things like directory structures,because the child elements can be expanded andcontracted by clicking the plus and minus boxes, justlike a file viewer. With QListView, you can selectrows or individual cells; then cut and paste the data,sort by column, and you’ll have QCheckBox widgetsrendered in cells.

Lists and trees in Qt are provided by the QListViewwidget. QListView displays both plain lists andhierarchical data divided into rows and columns. It’sperfect for displaying things like directory structures,because the child elements can be expanded andcontracted by clicking the plus and minus boxes, justlike a file viewer. With QListView, you can selectrows or individual cells; then cut and paste the data,sort by column, and you’ll have QCheckBox widgetsrendered in cells.

47

Page 188: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

Dialogs

Dialogs are useful whenever you want the user to inputspecific information for a particular task, or impart smallamounts of information to the user, such as a warning orerror message. It’s preferable to subclass QDialog forthese tasks because you get convenient methods forrunning the dialog and purpose-designed signals and slotsto handle the user response.

Modal dialog box Nonmodal dialog box Semimodal dialog box

Dialogs are useful whenever you want the user to inputspecific information for a particular task, or impart smallamounts of information to the user, such as a warning orerror message. It’s preferable to subclass QDialog forthese tasks because you get convenient methods forrunning the dialog and purpose-designed signals and slotsto handle the user response.

Modal dialog box Nonmodal dialog box Semimodal dialog box

48

Page 189: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

QDialog

QDialog is the base dialog class in Qt thatprovides exec and show methods for handlingmodal and nonmodal dialogs, has an integralQLayout you can use, and has several signals andslots useful for responding to button presses.

QDialog is the base dialog class in Qt thatprovides exec and show methods for handlingmodal and nonmodal dialogs, has an integralQLayout you can use, and has several signals andslots useful for responding to button presses.

49

Page 190: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

QMessageBox

A QMessageBox is a modal dialog that displays asimple message with an icon and buttons. Theicon depends on the severity of the message,which can be regular information or warnings andother critical information.

#include <qmessagebox.h>

A QMessageBox is a modal dialog that displays asimple message with an icon and buttons. Theicon depends on the severity of the message,which can be regular information or warnings andother critical information.

#include <qmessagebox.h>

50

Page 191: LẬP TRÌNH MÃ NGUỒN MỞ - Nothing is impossible · PDF fileBlog: Email: ... Giúp sinh viên hiểu về lập trình Shell cho Linux, ... Giáo trình và TLTK ðnGiáo trình

QInputDialog

QInputDialog is useful for inputting single valuesfrom the user, which can either be text, an optionfrom a drop-down list, an integer, or a floating-point value. The QInputDialog class has staticmethods like QMessageBox that are a bit of ahandful because they have many parameters, butfortunately most have default values.

#include <qinputdialog.h>

QInputDialog is useful for inputting single valuesfrom the user, which can either be text, an optionfrom a drop-down list, an integer, or a floating-point value. The QInputDialog class has staticmethods like QMessageBox that are a bit of ahandful because they have many parameters, butfortunately most have default values.

#include <qinputdialog.h>

51