Tại sao một số liên kết tượng trưng ảnh hưởng đến hành vi chương trình?


7

Một điều khiến tôi bối rối trong một thời gian là:

% which halt
/sbin/halt
% file /sbin/halt
/sbin/halt: symbolic link to `reboot'

Tuy nhiên, thực thi sudo halt, tất nhiên, không khởi động lại hệ thống. Tại sao vậy?

Có một số chương trình khác làm việc theo cách đó, ví dụ pdflatex.

Câu trả lời:


13

Mọi chương trình đều có thể thấy dòng lệnh đầy đủ đã được sử dụng để chạy nó (ngoại trừ các ký tự đại diện và các biến, mà shell mở rộng).

Trong một chương trình C, dòng lệnh được lưu trữ argv, viết tắt của vectơ đối số .
Tên của progam là yếu tố đầu tiên của argv, tức là argv[0].

Rõ ràng trong trường hợp haltreboot, chương trình đang thay đổi hành vi của nó dựa trên argv[0].

Từ bash, bạn có thể thấy dòng lệnh đầy đủ được sử dụng để chạy chương trình bằng cách sử dụng ps -p <pid> -o cmdhoặc cat /proc/<pid>/cmdline.

Lưu ý rằng có một loại liên kết khác gọi là liên kết cứng sẽ có tác dụng tương tự. Trên hệ thống của tôi chẳng hạn, sudosudoeditlà cùng một tệp có hai tên khác nhau và các hành vi khác nhau.

ls -i có thể giúp bạn tìm các lệnh đó, vd:

$ ls -il | awk '$3 != 1 { print }'
total 156872
2491111 -rwsr-xr-x 2 root   root     127560 2011-01-20 05:03 sudo
2491111 -rwsr-xr-x 2 root   root     127560 2011-01-20 05:03 sudoedit

Xem man lnđể biết thêm chi tiết về các liên kết cứng nếu bạn không quen thuộc với chúng.


Thật thú vị, tôi không biết các liên kết tượng trưng hành xử theo cách đó.
Christoph Wurm

6
@legate, symlink không, ứng dụng có thể. ví dụ tốt nhất về chương trình sử dụng tên của nó để xác định cách thức thực thi busybox. symlink chỉ là cách số một để xác định đối số 0 cho một ứng dụng. chỉ cần đổi tên một tập tin cũng sẽ đủ.
xenoterracide

Tôi đã thất bại trong việc phân tích cái này: Lưu ý rằng còn có một liên kết cứng sẽ có tác dụng tương tự.
tshepang

Tôi đã viết lại câu đó. Hy vọng rằng nó rõ ràng hơn bây giờ.
Mikel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.