wayground logo

Free Printable Worksheets

Font size

S
M
L
XL
Worksheets

Câu hỏi về lập trình socket và đa luồng

Total questions: 73

Worksheet time: 37mins

Name
Class
Date
1.

Câu 1: Lập trình truyền thông với socket cho phép:

a)

Quản lý bộ nhớ

b)

Đọc và ghi file

c)

Tối ưu hóa bộ nhớ

d)

Truyền thông giữa các máy trong mạng

2.

Câu 2: Trong lập trình đa luồng với pthread, hàm nào được sử dụng để theo dõi trạng thái kết thúc của một luồng và thu hồi tài nguyên khi luồng đó kết thúc?

a)

pthread_detach()

b)

pthread_join()

c)

pthread_create()

d)

pthread_exit()

3.

Câu 3: Hai phương thức SOCK_STREAM và SOCK_DGRAM lần lượt tương ứng với giao thức tầng vận chuyển nào?

a)

IPv4 và IPv6

b)

TCP và UDP

c)

UDP và TCP

d)

HTTP và FTP

4.

Câu 4: Trong lệnh tạo socket: sockfd = socket(AF_INET, SOCK_STREAM, 0); Tham số nào chỉ loại giao thức (protocol) khi tạo socket và giá trị của nó là gì?

a)

Tham số SOCK_STREAM, giá trị là 1

b)

Tham số 0, giá trị là Protocol mặc định

c)

Tham số AF_INET, giá trị là IPv4

d)

Tham số SOCK_STREAM, giá trị là 0

5.

Câu 5: Từ khóa AF_UNIX trong lập trình socket được dùng làm gì?

a)

Kết nối mạng LAN

b)

Kết nối trong cùng hệ thống (local)

c)

Kết nối trên mạng IPv6

d)

Kết nối trên mạng IPv4

6.

Câu 6: Trong lập trình đa luồng, hàm pthread_mutex_lock() được sử dụng để làm gì?

a)

Hủy mutex sau khi hoàn thành công việc

b)

Khóa mutex để ngăn các luồng khác truy cập vào tài nguyên dùng chung

c)

Mở khóa mutex để cho phép các luồng khác truy cập tài nguyên

d)

Khởi tạo một mutex để đồng bộ hóa luồng

7.

Câu 7: Trong lập trình socket, hàm listen() thường được sử dụng để làm gì?

a)

Cho phép server lắng nghe các yêu cầu kết nối từ client

b)

Cho phép client lắng nghe kết nối từ server

c)

Đóng một socket đã tạo

d)

Tạo kết nối tới server

8.

#include <stdio.h>

#include <pthread.h>

#define n 100000000

void* DemSoLe(void* arg) {

    long dem = 0;

    for (long i = 1; i <= n; i++) {

        if (i % 2 != 0) dem++;

    }

    printf("%ld\n", dem);

    return NULL;

}

int main() {

    pthread_t thread_id;

    pthread_create(&thread_id, NULL, DemSoLe, NULL);

    pthread_join(thread_id, NULL);  // Dòng này bị xóa

    return 0;

}
Giả sử trong đoạn mã trên, dòng pthread_join(thread_id, NULL); bị xóa đi. Điều gì sẽ có khả năng xảy ra khi chạy chương trình?

a)

Chương trình sẽ không thể tạo luồng mới để thực hiện công việc.

b)

Chương trình sẽ chạy bình thường và in ra kết quả mà không gặp vấn đề gì.

c)

Tài nguyên của luồng sẽ không được giải phóng ngay cả khi luồng đó đã hoàn thành, không in ra kết quả.

d)

Chương trình sẽ rơi vào vòng lặp vô hạn và không bao giờ kết thúc.

9.

#include <stdio.h>

#include <pthread.h>

void* print_hello(void* arg){

    printf("Hello Thread\n");

    return NULL;

}

int main() {

    pthread_t thread_id;

    pthread_create(&thread_id, NULL, print_hello, NULL);

    pthread_join(thread_id, NULL);

    return 0;

}

Câu hỏi:
Trong đoạn mã trên, chức năng chính của lệnh pthread_create là gì?

a)
  • Đợi luồng phụ kết thúc trước khi tiếp tục thực hiện chương trình.

b)
  • Kiểm tra xem có lỗi xảy ra trong hàm print_hello() hay không.

c)

Tạo một biến pthread_t để lưu trữ số lượng luồng.

d)

Tạo một luồng mới để thực hiện hàm print_hello()

10.

Cho demso.c chứa mã nguồn chương trình C như sau:

#include <stdio.h>

#include <pthread.h>

 

int dem = 0;

 

void* DemSo() {

    int i;

    for (i = 0; i < 10000; i++) {

        dem++;

    }

    return NULL;

}

void main() {

    pthread_t thread0, thread1, thread2;

    pthread_create(&thread0, NULL, DemSo, NULL);

    pthread_create(&thread1, NULL, DemSo, NULL);

    pthread_create(&thread2, NULL, DemSo, NULL);

    pthread_join(thread0, NULL);

    pthread_join(thread1, NULL);

    pthread_join(thread2, NULL);

    printf("%d\n", dem);

}
Khi chạy chương trình này, giá trị nào dưới đây có thể là kết quả in ra của biến dem?

a)

Một số giá trị ngẫu nhiên nằm trong khoảng từ 10000 đến 20000)

b)

Kết quả sẽ luôn là 0

c)

10000

d)

20000

11.

Cho demso.c chứa mã nguồn chương trình C như sau:

#include <stdio.h>

#include <pthread.h>

int dem = 0;

void* DemSo() {

    int i;

    for (i = 0; i < 10000; i++) {

        dem++;

    }

    return NULL;

}

void main() {

    pthread_t thread0, thread1, thread2;

    pthread_create(&thread0, NULL, DemSo, NULL);

    pthread_create(&thread1, NULL, DemSo, NULL);

    pthread_create(&thread2, NULL, DemSo, NULL);

    pthread_join(thread0, NULL);

    pthread_join(thread1, NULL);

    pthread_join(thread2, NULL);

 

    printf("%d\n", dem);

}

Câu hỏi:
Nguyên nhân nào khiến kết quả của biến dem có thể khác nhau mỗi lần chạy chương trình?

a)

Giá trị của biến dem không được khởi tạo đúng cách.

b)

Hàm pthread_join không đợi hai luồng hoàn thành.

c)

Hàm pthread_create không được gọi đúng cách.

d)

Thiếu đồng bộ hóa khi cả hai luồng cùng truy cập và thay đổi biến dem.

12.

Cho demso.c chứa mã nguồn chương trình C như sau:

#include <stdio.h>

#include <pthread.h>

int count = 0;

pthread_mutex_t lock;

void* increase_count() {

    int i;

    for (i = 0; i < 10000; i++) {

        pthread_mutex_lock(&lock);

        count++;

        pthread_mutex_unlock(&lock);

    }

    return NULL;

}

void main() {

    pthread_t thread0, thread1, thread2;

   

    pthread_mutex_init(&lock, NULL);

    pthread_create(&thread0, NULL, increase_count, NULL);

    pthread_create(&thread1, NULL, increase_count, NULL);

    pthread_create(&thread2, NULL, increase_count, NULL);

    pthread_join(thread0, NULL);

    pthread_join(thread1, NULL);

    pthread_join(thread2, NULL);

    printf("Count = %d\n", count);

}
Mục đích của pthread_mutex_lock(&lock); và pthread_mutex_unlock(&lock); trong hàm increase_count() là gì?

a)

Để tăng tốc độ thực thi của chương trình.

b)

Để dừng chương trình khi count đạt đến 10000.

c)

Để tạo ra các luồng mới.

d)

Để đảm bảo rằng chỉ có một luồng có thể truy cập và thay đổi biến count tại một thời điểm.

13.

Cho demso.c chứa mã nguồn chương trình C như sau

#include <stdio.h>

#include <pthread.h>

 

int count = 0;

pthread_mutex_t lock;

 

void* increase_count() {

    int i;

    for (i = 0; i < 10000; i++) {

        pthread_mutex_lock(&lock);

        count++;

        pthread_mutex_unlock(&lock);

    }

    return NULL;

}

void main() {

    pthread_t thread0, thread1;

    pthread_mutex_init(&lock, NULL);

    pthread_create(&thread0, NULL, increase_count, NULL);

    pthread_create(&thread1, NULL, increase_count, NULL);

    pthread_join(thread0, NULL);

    pthread_join(thread1, NULL);

    printf("Count = %d\n", count);

}
Giá trị in ra của count khi chạy chương trình này sẽ là gì?

a)

0

b)

10000

c)

Giá trị không xác định

d)

20000

14.

Cho server.c chứa mã nguồn chương trình C như sau:

len = sizeof(cli);

connfd = accept(sockfd, (SA *) &cli, &len);

if (connfd < 0)

{

    printf("server accept failed...\n");

    exit(0);

}

else

    printf("server accept the client...\n");

Câu hỏi: Trong đoạn mã connfd = accept(sockfd, (SA *) &cli, &len);, connfd chứa thông tin gì?

a)

Địa chỉ IP của client.

b)

Mô tả của socket client.

c)

Mô tả của socket mới để giao tiếp với client.

d)

Mô tả của socket server.

15.

Phương thức để tạo một luồng mới trong C sử dụng thư viện pthread là gì?

a)

pthread_new()

b)

pthread_thread()

c)

pthread_create()

d)

pthread_init()

16.

Câu lệnh nào được sử dụng để tạo ra một mutex trong lập trình luồng?

a)

pthread_mutex_create()

b)

pthread_mutex_lock()

c)

pthread_mutex_init()

d)

pthread_mutex_unlock()

17.

Trong lập trình truyền thông, số hiệu cổng (port number) dùng để?

a)

Định danh địa chỉ IP

b)

Lắng nghe kết nối

c)

Phân biệt các ứng dụng trên cùng một máy

d)

Tạo socket

18.

Khi một luồng đang giữ một mutex và không giải phóng nó, các luồng khác cần tài nguyên đó sẽ làm gì?

a)

Chờ đến khi mutex được mở khóa

b)

Khóa thêm lần nữa

c)

Hủy mutex đó

d)

Tự động truy cập tài nguyên

19.

Trong lập trình socket, SOCK_STREAM dùng để chỉ loại kết nối nào?

a)

Kết nối tin cậy, tuần tự

b)

Gửi và nhận dữ liệu thô

c)

Kết nối không tin cậy, không tuần tự

d)

Truyền thông giữa các máy tính qua giao thức HTTP

20.

: Cho một chương trình C sử dụng Thread (đa luồng) trong file program.c có nội dung như sau:

#include <stdio.h>

#include <pthread.h>

void* print_hello(void* arg){

    printf("Hello Thread\n");

    return NULL;

}

int main(){

    pthread_t thread_id;

    pthread_create(&thread_id, NULL, print_hello, NULL);

    pthread_join(thread_id, NULL);

    return 0;

}

Lệnh nào sau đây được dùng để biên dịch chương trình này một cách chính xác?

a)

gcc program.c -o program

b)

gcc program.c -o program -pthread

c)

gcc program.c -o program -lthread

d)

gcc program.c -pthread -o program

21.

Giả sử trong đoạn mã trên, dòng pthread_join(thread_id, NULL); bị xóa đi. Điều gì sẽ có khả năng xảy ra khi chạy chương trình?

a)

Chương trình sẽ rơi vào vòng lặp vô hạn và không bao giờ kết thúc.

b)

Chương trình sẽ không thể tạo luồng mới để thực hiện công việc.

c)

chạy bình thường và in ra kết quả mà không gặp vấn đề gì.

d)

Tài nguyên của luồng sẽ không được giải phóng ngay cả khi luồng đó đã hoàn thành, không in ra kết quả.

22.

Trong chương trình này, lệnh pthread_mutex_init(&lock, NULL); có vai trò gì?

a)

Khởi tạo các luồng thread0 và thread1.

b)

Khởi tạo biến count với giá trị ban đầu là 0.

c)

Khởi tạo mutex lock để sử dụng cho đồng bộ hóa luồng.

d)

Gọi hàm increase_count()

23.

Đoạn mã nào cần thêm vào cuối hàm để giải phóng tài nguyên của mutex look

a)

pthread_mutex_unlock(&lock);

b)

pthread_mutex_destroy(&lock);

c)

pthread_exit(NULL);

d)

pthread_cancel(thread0); pthread_cancel(thread1);

24.

Mục đích của trình biên dịch chéo (cross-compiler) là gì?

a)

Tăng tốc độ khởi động hệ thống

b)

Tối ưu hóa file hệ thống root

c)

Biên dịch mã nguồn cho kiến trúc phần cứng khác với máy host

d)

Cấu hình phần cứng của board

25.

Yêu cầu dung lượng trống tối thiểu của đĩa cứng trên máy tính khi cài đặt môi trường phát triển cho board nhúng là:

a)

20GB

b)

10GB

c)

15GB

d)

25GB

26.

U-boot là gì trong quá trình phát triển hệ điều hành cho board nhúng?

a)

Trình biên dịch kernel

b)

Trình tải khởi động (bootloader)

c)

Trình biên dịch các ứng dụng người dùng

d)

Bộ công cụ xây dựng kernel

27.

Lệnh nào dưới đây trên hệ điều hành Linux được sử dụng để kiểm tra địa chỉ IP của board nhúng khi kết nối với mạng?

a)

ipconfig

b)

ls

c)

ifconfig

d)

netstat

28.

Để điều khiển các thiết bị ngoại vi trên board nhúng, cần phải cài đặt:

a)

Phần mềm văn phòng

b)

Ứng dụng nghe nhạc

c)

Trình điều khiển (driver) tương ứng

d)

Trình duyệt web

29.

Công cụ toolchain trong quy trình biên dịch hệ điều hành nhúng có vai trò chính là:

a)

Cung cấp trình biên dịch chéo GCC

b)

Cung cấp các thư viện hệ thống

c)

Phân tích lỗi hệ thống

d)

Biên dịch mã thành mã nguồn mở

30.

Trong quy trình biên dịch hệ điều hành nhúng, bộ công cụ toolchain cung cấp những gì?

a)

Bộ công cụ để tạo các file nén

b)

Bộ công cụ cài đặt hệ điều hành

c)

Trình biên dịch, trình liên kết và các công cụ hỗ trợ biên dịch mã nguồn

d)

Trình cài đặt bootloader

31.

Chức năng của mkimage trong quy trình biên dịch hệ điều hành nhúng là gì?

a)

Tạo hình ảnh bộ nhớ

b)

Biên dịch mã nguồn thành file thực thi

c)

Chạy hệ điều hành trên board nhúng

d)

Tạo file image cho kernel và bootloader

32.

Sau khi biên dịch hệ điều hành và kernel, để cài đặt lên board nhúng, bước tiếp theo là gì?

a)

Chạy ứng dụng trên máy tính chủ

b)

Tạo hệ thống file nhúng

c)

Cài đặt bộ cài hệ điều hành vào bộ nhớ flash của board nhúng

d)

Biên dịch lại kernel

33.

Công cụ nào thường được sử dụng để quản lý và biên dịch mã nguồn cho hệ điều hành nhúng?

a)

Makefile

b)

Visual Studio

c)

Eclipse

d)

PyCharm

34.

Kiểm tra tính tương thích của kernel sau khi biên dịch với phần cứng thiết bị sẽ giúp gì?

a)

Đảm bảo tất cả các driver phần cứng hoạt động ổn định

b)

Kiểm tra khả năng kết nối internet của thiết bị

c)

Kiểm tra giao diện người dùng của hệ điều hành

d)

Kiểm tra tốc độ của các ứng dụng

35.

Trước khi tạo uImage bằng mkimage, bạn cần cài đặt công cụ hỗ trợ. Trên hệ điều hành Ubuntu, lệnh nào sau đây là đúng để cài đặt công cụ cần thiết?

a)

sudo install mkimage

b)

sudo apt install uboot-tools

c)

apt-get uboot-image

d)

apt-get install mkimage-tools

36.

Bạn cần chạy file Makefile có tên Makefile-build để thực hiện mục tiêu all. Lệnh nào sau đây là đúng?

a)

sudo make all Makefile-build

b)

make -f Makefile-build all

c)

make build all

d)

make Makefile-build all

37.

Bạn cần cấu hình file uEnv.txt để khởi động board nhúng từ thẻ microSD với các tham số console, netargs, netboot, và uenvcmd. Cấu hình nào dưới đây là đúng?

a)

console=ttyS0,9600n8 netargs=setenv bootargs console=ttyO2,9600n8 root=/dev/mmcblk1p1 rw rootfstype=ext4 rootwait netboot=echo Booting from eMMC...; load mmc 0:1 ${loadaddr} uImage; load mmc 0:1 ${fdtaddr} am335x-boneblack.dtb; run netargs; bootm ${loadaddr} ${fdtaddr} uenvcmd=run netboot 1

b)

console=ttyO0,115200n8 root=/dev/mmcblk0p2 ro rootfstype=ext4 autoload=no uenvcmd=run loadimage

c)

console=ttyO0,115200n8 netargs=setenv bootargs console=ttyS0,115200n8 root=/dev/sda1 rw rootfstype=ext4 rootwait netboot=echo Booting from USB...; load usb 0:1 ${loadaddr} uImage; load usb 0:1 ${fdtaddr} am335x-boneblack.dtb; run netargs; bootm ${loadaddr} ${fdtaddr}

38.

Khi build Root File System (RFS) cho board nhúng, bạn cần giải nén file rootfs.tar vào một thư mục trên hệ thống và sao chép các file từ thư mục đó vào thẻ nhớ. Câu lệnh nào dưới đây là đúng?

a)

tar -xvf rootfs.tar -C /mnt/rfs và cp -r /mnt/rfs/* /mnt/sdcard/

b)

tar -xvf rootfs.tar -C /media/sdcard/RFS/ và cp -r /mnt/rfs/* /media/sdcard/

c)

tar -xvf rootfs.tar -C /mnt/rfs và cp -r /mnt/rfs/* /media/sdcard/

d)

tar -xvf rootfs.tar -C /mnt/rfs và cp -r /mnt/rfs/* /media/sdcard/RFS/

39.

Để điều khiển các thiết bị ngoại vi trên board nhúng, cần phải cài đặt:

a)

Ứng dụng nghe nhạc

b)

Trình duyệt web

c)

Trình điều khiển (driver) tương ứng

d)

Phần mềm văn phòng

40.

Lệnh nào dưới đây được sử dụng để khởi động lại hệ điều hành trên board nhúng?

a)

exit

b)

shutdown

c)

reboot

d)

powero

41.

Vai trò chính của kbuild trong hệ thống phần mềm là:

a)

Cài đặt phần mềm

b)

Biên dịch kernel

c)

Tạo môi trường phát triển

d)

Biên dịch các thư viện hệ thống

42.

Quy trình biên dịch hệ điều hành nhúng trên board nhúng bắt đầu từ bước nào?

a)

Cài đặt bootloader

b)

Cài đặt toolchain

c)

Biên dịch kernel

d)

Tạo file hệ thống

43.

Bootloader trên board nhúng có vai trò gì trong quy trình khởi động hệ điều hành?

a)

Khởi động kernel từ bộ nhớ

b)

Biên dịch hệ điều hành

c)

Cài đặt kernel

d)

Tạo bộ nhớ ảo

44.

Sau khi biên dịch kernel cho board nhúng, bạn cần lưu các file cần thiết vào thẻ nhớ để board có thể khởi động. Câu nào dưới đây là đúng khi chỉ định các file cần thiết cho việc khởi động?

a)

Image, am335x-boneblack.dtb, uEnv.txt

b)

vmlinuz, dtb, boot.cmd

c)

kernel.img, deb, Env.txt

d)

uImage, boot.scr

45.

Trên ảnh chưa chắc chắn

a)

Dùng fdisk tạo phân vùng FAT32 1000 MB và ext3 50 MB, sau đó sử dụng lệnh mkfs.fat32 và mkfs.ext3 để định dạng.

b)

B. Sử dụng gparted để tạo phân vùng ext3 1000 MB và phân vùng FAT32 50 MB, rồi gần nhân BOOT cho phân vùng đầu tiên và RFS cho phân vùng thứ hai.

c)

Sử dụng GParted để tạo phân vùng FAT32 (1000 MB) và phân vùng ext3 (50 MB), sau đó gần nhân BOOT cho phân vùng đầu tiên và RFS cho phân vùng thứ hai.

d)

Dùng parted tạo phân vùng FAT32 1000 MB và ext3 50 MB, sau đó sử dụng lệnh mkfs.fat32 cho phân vùng BOOT và mkfs.ext3 cho phân vùng RFS.

46.

Khi module kernel được nạp, thông tin về nó có thể được kiểm tra bằng lệnh nào?

a)

lsmod

b)

rmmod

c)

modprobe

d)

insmod

47.

Lệnh nào được sử dụng để nạp một module vào kernel?

a)

dmesg

b)

rmmod

c)

make

d)

insmod

48.

Lệnh nào được sử dụng để tháo module ra khỏi kernel?

a)

insmod

b)

modprobe

c)

rmmod

d)

lsmod

49.

Khi gọi hàm dmesg, điều gì sẽ xảy ra?

a)

Nó nạp một module vào kernel.

b)

Nó ghi dữ liệu vào file.

c)

Nó trả về tất cả các thông tin hệ thống trong bộ nhớ.

d)

Nó hiển thị tất cả các thông báo hoặc lỗi trong kernel log.

50.

Hai hàm module_init() và module_exit() dùng để làm gì?

a)

Định nghĩa hàm khởi tạo và hủy driver khi nạp và gỡ bỏ

b)

Định nghĩa các hàm đọc/ghi của driver

c)

Điều khiển quá trình khởi động hệ thống

d)

Cấp phát bộ nhớ cho driver

51.

Lệnh nào được sử dụng để tháo module hello.ko khỏi kernel?

a)

$ sudo rmmod hello.ko

b)

$ dmesg

c)

$ make clean

d)

$ sudo insmod hello.ko

52.

Lệnh nào được sử dụng để lắp module hello.ko vào kernel?

a)

$ sudo insmod hello.ko

b)

$ modinfo hello.ko

c)

$ make

d)

$ dmesg

53.

Câu nào dưới đây mô tả chính xác về tệp .ko trong hệ điều hành Linux?

a)

Tệp .ko là tệp chứa mã nguồn của kernel module.

b)

Tệp .ko là tệp nhị phân được tạo ra khi biên dịch kernel module và có thể được tải vào kernel.

c)

Tệp .ko là tệp thực thi của hệ điều hành Linux.

d)

Tệp .ko là tệp cấu hình hệ thống của kernel.

54.

Trong quá trình biên dịch một chương trình hoặc kernel module, lệnh make clean có tác dụng gì?

a)

Hiển thị thông tin về kernel module

b)

Cài đặt kernel module vào hệ thống

c)

Chạy chương trình sau khi biên dịch xong

d)

Xóa các tệp tạm thời và tệp đã biên dịch trước đó

55.

Bạn đã biên dịch một kernel module có tệp là hello.c với Makefile có nội dung như sau: make obj-m += hello.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean Lệnh nào sau đây được dùng để biên dịch kernel module hello.o?

a)

$ make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

b)

$ make hello.o

c)

$ sudo insmod hello.ko

d)

$ make

56.

Bạn đã biên dịch một kernel module có tệp là hello.c với Makefile có nội dung như sau:

make

obj-m += hello.o

 

all:

    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

 

clean:

    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Lệnh nào sau đây được dùng để biên dịch kernel module hello.o?

A. $ make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
B. $ make hello.o
C. $ sudo insmod hello.ko
D. $ make/


Câu 11: Cho tệp kernel_module.c chứa mã nguồn chương trình C như sau:

#include <linux/module.h>

#include <linux/kernel.h>

 

int __init hello_module(void)

{

    printk(KERN_INFO "Hello\n");

    return 0;

}

 

void __exit bye_module(void)

{

    printk(KERN_INFO "Goodbye\n");

}

 

module_init(hello_module);

module_exit(bye_module);

Trong đoạn mã trên, chức năng của __init được sử dụng trong hàm hello_module là gì?

a)

Định nghĩa phiên bản của module

b)

Chỉ định rằng hàm sẽ chỉ được sử dụng khi khởi tạo module

c)

Chỉ định rằng hàm sẽ chỉ được sử dụng khi gỡ bỏ module

d)

Tự động gọi hàm khi module gặp lỗi

57.

Trong đoạn mã trên, nếu muốn thay đổi thông báo từ "Hello" thành "Hello Linux", cần chỉnh sửa dòng nào?

a)

MODULE_LICENSE("GPL");

b)

printk(KERN_INFO "Hello\n");

c)

module_init(hello_module);

d)

MODULE_AUTHOR("KTMT");

58.

int tong=0;

 

int __init hello_module(void)

{

    int a=10;

    int b=20;

    tong=a+b;

    ......

    return 0;

}

Điền vào chỗ trống câu lệnh đúng để in ra tổng của hai số a và b trong kernel module.

a)

printk(KERN_WARNING "Tong: %d + %d = %d\n",a,b,tong);

b)

printk(KERN_INFO "Tong: %d + %d = %d\n",a,b,tong);/

c)

printk(KERN_DEBUG "Tong: %d + %d = %d\n",a,b,tong);

d)

printf("Tong: %d + %d = %d\n",a,b,tong);

59.

Đoạn code nào dưới đây của chương trình kernel module thực hiện khi tháo driver khỏi hệ thống, nó sẽ thực hiện tính tổng liên tiếp các số từ 1 đến 10 và in kết quả ra log của hệ thống?

a)

int __init hello_module(void)

{

int sum = 0;

int i;

for (i = 1; i <= 10; i++) {

sum += i;

}

printk(KERN_INFO "Tong cac so tu 1 den 10 la: %d\n", sum);

}

b)

void __exit bye_module(void)

{

int sum = 0;

int i;

for (i = 1; i <= 10; i++) {

sum += i;

}

printk(KERN_INFO "Tong cac so tu 1 den 10 la: %d\n", sum);

}

c)

void tinhtong() {

int sum = 0;

int i;

for(i = 1; i <= 10; i++) {

sum += i;

}

printk(KERN_INFO "Tong cac so tu 1 den 10 la: %d\n");

}

int __init hello_module(void)

{

printk(KERN_INFO "Hello\n");

return 0;

}

void __exit bye_module(void)

{

printk(KERN_INFO "goodbyr\n");

}

d)

void __exit bye_module(void)

{

int sum = 0;

int i;

for(i = 1; i <= 10; i++) {

sum += i;

}

printf("Tong cac so tu 1 den 10 la: %d\n");

}

60.

Cấu trúc Makefile nào sau đây là đúng để biên dịch một kernel module có tên hel_sua.o và xóa các tệp biên dịch trước đó?

a)

obj-m += hel_sua.o

all:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:

rm -rf $(PWD)/hello.o

b)

obj-m += hel_sua.o

all:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

make module

clean:

rm -rf /lib/modules/$(shell uname -r)/build

c)

obj-m += hel_sua.o

all:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:

make clean

d)

obj-m += hel_sua.o

all:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

61.

Khi một module kernel được nạp vào kernel, hàm nào trong module đó sẽ được gọi đầu tiên?

a)

printk

b)

init

c)

dmesg

d)

exit

62.

Hàm printk() trong kernel được sử dụng để làm gì?

a)

Nạp một module vào kernel

b)

Ghi dữ liệu vào file

c)

In ra thông báo hoặc lỗi trong kernel log

d)

Đọc dữ liệu từ kernel

63.

Khi chạy trong user mode, một ứng dụng không thể trực tiếp truy cập vào:

a)

Bộ nhớ của hệ thống

b)

CPU

c)

Tất cả các vùng bộ nhớ

d)

Bộ nhớ của kernel

64.

Sau khi sử dụng lệnh $ make để biên dịch một kernel module, kết quả của lệnh sẽ là gì?

a)

Kiểm tra thông tin cấu hình của module.

b)

Tạo ra tệp .ko để có thể nạp vào kernel.

c)

Tạo ra một thư mục chứa các file log hệ thống.

d)

Tạo ra một file thực thi trong user space.

65.

Khi thực hiện lệnh $ insmod hello.ko để nạp một kernel module vào hệ thống, lệnh này yêu cầu quyền nào?

a)

Quyền biên dịch

b)

Quyền kiểm tra thông báo hệ thống

c)

Quyền root hoặc quyền quản trị viên

d)

Quyền của người dùng bình thường

66.

Đoạn mã nào sau đây được viết đúng cho một kernel module trong Linux?

a)

#include #include int init_module(void) { printk(KERN_INFO "Xin chao\n"); return 0; } void cleanup_module(void) { printk(KERN_INFO "Tam biet\n"); }

b)

#include int main(){ printf("Xin chao!\n"); return 0; }

c)

#include #include void __init start() { printk(KERN_INFO "Xin chao\n"); } void __exit end() { printk(KERN_INFO "Tam biet\n"); }

d)

#include #include int start(void) { printk(KERN_INFO "Xin chao\n"); return 0; } void end(void) { printk(KERN_INFO "Tam biet\n"); }

67.

Cho tệp kernel_module.c chứa mã nguồn chương trình C như sau:

#include <linux/module.h>

#include <linux/kernel.h>

MODULE_AUTHOR("KTMT");

MODULE_LICENSE("GPL");

MODULE_VERSION("0.2");

int __init hello_module(void)

{

    printk(KERN_INFO "Hello world\n");

    return 0;

}

void __exit bye_module(void)

{

    printk(KERN_INFO "Goodbye\n");

}

module_init(hello_module);

module_exit(bye_module);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("KTMT");

MODULE_DESCRIPTION("DRIVER");

Trong đoạn mã trên, lệnh nào được dùng để khai ký hàm hello_module làm hàm khởi tạo module khi nạp vào kernel?

a)

module_init(hello_module);

b)

init_module();

c)

module_exit(bye_module);

d)

start_module(hello_module);

68.

Kernel space và user space khác nhau như thế nào?

a)

Kernel space là vùng bộ nhớ dành riêng cho kernel và các phần mềm hệ thống, còn user space là vùng bộ nhớ dành cho các ứng dụng người dùng.

b)

Không có sự khác biệt giữa chúng.

c)

Kernel space chỉ dùng cho driver, còn user space chỉ dùng cho ứng dụng.

d)

Kernel space dành cho các chương trình của người dùng, còn user space dành cho hệ thống.

69.

Trong hệ điều hành Linux thì kernel module là gì?

a)

Một tệp cấu hình của kernel được sử dụng để thay đổi các tham số hệ thống

b)

Một đoạn mã được biên dịch thành tệp .exe và chạy trong không gian người dùng

c)

Một chương trình độc lập chạy trên hệ điều hành mà không cần tương tác với kernel

d)

Một đoạn mã hoặc chương trình được biên dịch thành tệp .ko và có thể nạp vào kernel tại th

70.

Cho tệp kernel_module.c chứa mã nguồn chương trình C như sau:

#include <linux/module.h>

#include <linux/kernel.h>

MODULE_AUTHOR("KTMT");

MODULE_LICENSE("GPL");

MODULE_VERSION("0.2");

int __init hello_module(void)

{

    printk(KERN_INFO "Hello world\n");

    return 0;

}

void __exit bye_module(void)

{

    printk(KERN_INFO "Goodbye\n");

}

 

module_init(hello_module);

module_exit(bye_module);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("KTMT");

MODULE_DESCRIPTION("DRIVER");

Trong đoạn mã trên, dòng MODULE_LICENSE("GPL"); có ý nghĩa gì?

a)

Đảm bảo rằng module tuân theo giấy phép mã nguồn mở của GNU GPL

b)

Định nghĩa mô tả module

c)

Cấp phép sử dụng module cho người dùng thông thường

d)

Xác định phiên bản của module

71.

Cho tệp kernel_module.c chứa mã nguồn chương trình C như sau:

#include <linux/module.h>

#include <linux/kernel.h>

MODULE_AUTHOR("KTMT");

MODULE_LICENSE("GPL");

MODULE_VERSION("0.2");

int __init hello_module(void)

{

    printk(KERN_INFO "Hello world\n");

    return 0;

}

void __exit bye_module(void)

{

    printk(KERN_INFO "Goodbye\n");

}

module_init(hello_module);

module_exit(bye_module);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("KTMT");

MODULE_DESCRIPTION("DRIVER");

Trong đoạn mã trên, dòng nào đảm bảo rằng module chỉ được gỡ khỏi kernel khi hàm bye_module được gọi?

a)

module_init(hello_module);

b)

MODULE_DESCRIPTION("DRIVER");

c)

module_exit(bye_module);

d)

MODULE_LICENSE("GPL");

72.

Khi tháo module kernel, hàm nào sẽ được gọi?

a)

init

b)

dmesg

c)

printk

d)

exit

73.

Xem xét đoạn mã sau.

int tong=0;

int __init hello_module(void)

{

    int a=10;

    int b=20;

    tong = a + b;

    return 0;

}

void __exit bye_module(void)

{

    printk(KERN_INFO "Tong= %d\n", tong);

}

Lỗi gì có thể xảy ra nếu bye_module cố gắng truy cập biến cục bộ trong hello_module?

a)

Lỗi biên dịch do sử dụng biến cục bộ tong trong bye_module.

b)

Lỗi runtime do không thể truy cập biến cục bộ tổng.

c)

Không có lỗi, chương trình sẽ hoạt động bình thường.

d)

Lỗi logic do không tính tổng trong bye_module.