2008-10-15 34 views
13

Tôi muốn biết chính xác cách lệnh "Is" hoạt động trong Linux và Unix.Lệnh 'ls' hoạt động như thế nào trong Linux/Unix?

Theo như tôi biết, lks forks & thực hiện với vỏ linux/unix và sau đó lấy đầu ra (của cây tệp hiện tại. Ví dụ/home/ankit/). Tôi cần một lời giải thích chi tiết hơn, vì tôi không chắc chắn về những gì xảy ra sau khi gọi ngã ba.

Có thể giải thích chi tiết chức năng của lệnh 'ls' không?

Trả lời

38

ls không ngã ba. Các trình bao vỏ và các toán tử để chạy bất kỳ lệnh nào không được xây dựng, và một trong các lệnh mà nó có thể chạy là ls.

ls sử dụng opendir() và readdir() để duyệt qua tất cả các tệp trong thư mục. Nếu nó cần thêm thông tin về một trong số chúng, nó gọi stat().

+1

Là một điểm đáng chú ý, tôi nghĩ bạn sẽ tìm thấy chỉ số stat() của tất cả các tệp trong thư mục, đặc biệt nếu màu và/hoặc loại tệp trước/hậu tố được bật. –

+0

Trên một lưu ý khác, tại sao vỏ cần phải ngã ba cho các quá trình tiền cảnh? –

+2

monoxide: một exec() mà không có một ngã ba() sẽ thay thế quá trình hiện đang chạy, có nghĩa là vỏ của bạn sẽ biến mất trong lần đầu tiên bạn chạy một lệnh. –

10

Để thêm vào câu trả lời, trong cuốn sách Ngôn ngữ lập trình C (K & RC), chúng đã đưa ra một ví dụ nhỏ về cách thực hiện ls. Họ đã giải thích các cấu trúc và chức năng được sử dụng rất tốt.

+1

Nếu có ai ở đây tìm kiếm, phần đó là '8.6' trong sách. – avi

4

Để hiểu những gì ls làm, bạn có thể đi lang thang tại nguồn OpenSolaris: https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/cmd/ls/ls.c.

Nếu điều đó áp đảo, trên Solaris bạn bắt đầu bằng cách sử dụng giàn để xem các cuộc gọi hệ thống mà ls thực hiện để hiểu những gì nó làm. Sử dụng giàn, hãy thử:

giàn -afl -o ls.out/bin/ls

sau đó nhìn vào sản lượng trong ls.out

Tôi tin rằng dấu vết đó là tương đương với giàn trong Linux.

+3

Phiên bản Linux của "giàn" được gọi là "strace". – Thomas

3

Nếu bạn thực sự muốn hiểu nội dung chi tiết của ls, hãy xem mã nguồn. Bạn có thể theo liên kết của tpgould đến nguồn Solaris hoặc dễ dàng tìm nguồn trực tuyến từ bất kỳ phân phối Linux hoặc BSD nào.

Tôi đặc biệt khuyên dùng nguồn 4.4BSD.

Khi tôi nhớ lại, ls bắt đầu bằng cách phân tích cú pháp nhiều tùy chọn của nó, sau đó bắt đầu với các tệp hoặc thư mục được liệt kê trên dòng lệnh (mặc định là "."). Subdirectories được xử lý bằng cách đệ quy vào thường trình danh sách thư mục. Không có fork() hoặc exec() mà tôi nhớ lại.

+0

Hoàn thành C newbie người thức dậy một buổi sáng tự hỏi làm thế nào C hoạt động. Đây có phải là tệp 4.4BSD được đề cập không? (Rõ ràng là sẽ mất một lúc trước khi tôi có thể hiểu được nó nhưng phải bắt đầu từ đâu đó…) https://github.com/sergev/4.4BSD-Lite2/blob/master/usr/ src/bin/ls/ls.c – henry

+0

@henry Đó là tập tin, mặc dù nó (hoặc bất kỳ ls.c khác) có lẽ là quá phức tạp cho một "newbie C hoàn thành" sử dụng nó để nghiên cứu. – mpez0

+0

Có chắc chắn sẽ không có sự hiểu biết này bất cứ lúc nào sớm, nhưng ít nhất tôi biết mục tiêu. Cảm ơn! – henry

0

Đây là một chủ đề cũ, nhưng tôi vẫn bình luận vì tôi tin rằng câu trả lời đã được upvoted và chấp nhận là một phần không chính xác. @Mark nói rằng ls được tích hợp vào shell nên shell không thực thi và fork. Khi tôi nghiên cứu tài liệu tldp trên bash (tôi đã đính kèm liên kết) "ls" không được liệt kê dưới dạng lệnh dựng sẵn.

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_01_03.html

lệnh Bash BUILTIN:

bí danh, ràng buộc, được xây dựng, chỉ huy, kê khai, echo, kích hoạt, giúp đỡ, chúng ta hãy, địa phương, đăng xuất, printf, đọc, shopt, chủng loại, typeset , ulimit và unalias.

+3

Tôi nghĩ rằng bạn đang hiểu nhầm câu trả lời ban đầu và trong thỏa thuận được làm nóng với nó. Câu hỏi đã nêu "ls forks & exec to linux/unix shell" mà câu trả lời được trả lời đúng "ls không fork. Vỏ forks và execs" và tiếp tục nói rằng ls là một trong các lệnh của nhánh shell/execs. – alanc

+1

@alanc Cảm ơn bạn đã làm rõ. Lên bỏ phiếu cho câu trả lời được chấp nhận :) – Raghupathy

Các vấn đề liên quan