banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix Hỏi đáp về file desciptor  XML
  [Question]   Hỏi đáp về file desciptor 03/05/2013 15:32:08 (+0700) | #1 | 275407
explorer88
Member

[Minus]    0    [Plus]
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
[Profile] [PM]
Em được biết file descriptor trong linux là các file đại diện cho stdin, stdout và stderr của một process. Bất cứ process nào muốn thực hiện đọc ghi file đều phải cần các file descriptor.

Em viết một script đơn giản rồi chạy nó đến bước đợi nhập từ bàn phím thì em xem PID của chương trình rồi tìm trong /proc/PID/fd thì em thấy các file 0,1,2,255. Em đã cố thử thay vì input data qua bàn phím thì ghi thẳng data đó vào file desciptor 0 nhưng vô hiệu. Em cũng xem khi input data từ bàn phím thì có gì trong file desciptor 0 nhưng khi cat nó thì không thấy gì cả.

Mọi người có thể giải thích cho em hoặc cho em tài liệu giải thích về cách một process sử dụng file descriptor để đọc ghi data không ạ ?
[Up] [Print Copy]
  [Question]   Hỏi đáp về file desciptor 05/05/2013 14:09:05 (+0700) | #2 | 275460
explorer88
Member

[Minus]    0    [Plus]
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
[Profile] [PM]
Sao chẳng ai trả lời em à. Dạo này đi hỏi chẳng ai trả lời cả, buồn ghê cơ smilie(
[Up] [Print Copy]
  [Question]   Hỏi đáp về file desciptor 05/05/2013 15:34:21 (+0700) | #3 | 275461
Stanley_00
Member

[Minus]    0    [Plus]
Joined: 01/03/2011 06:21:38
Messages: 74
Offline
[Profile] [PM]
file descriptor của một process do kernel quản lý. Còn cái bạn thấy trong file system là một cái file system ảo, chỉ để cho biết thông tin mà thôi, mình không nghĩ là bạn có khả năng thay đổi trong cái /proc đó đâu.

Nếu bạn muốn truyền dữ liệu từ stdout của 1 process sang stdin của process khác, bạn có thể dùng pipeline.
[Up] [Print Copy]
  [Question]   Hỏi đáp về file desciptor 05/05/2013 23:02:32 (+0700) | #4 | 275474
explorer88
Member

[Minus]    0    [Plus]
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
[Profile] [PM]
Ừm mình cứ nghĩ cơ chế làm việc của process với file trong linux là các data input và output được đẩy vào các file descriptor và các file descriptor này có thể can thiệp trực tiếp được nên mới thử nghiệm thế smilie
[Up] [Print Copy]
  [Question]   Hỏi đáp về file desciptor 13/05/2013 23:10:44 (+0700) | #5 | 275682
Mr.Khoai
Moderator

Joined: 27/06/2006 01:55:07
Messages: 954
Offline
[Profile] [PM]
Hello explorer88,

Bạn thử ghi dữ liệu vào fd 0 của script bằng cách nào? Vô hiệu là vô hiệu sao?

khoai
[Up] [Print Copy]
  [Question]   Hỏi đáp về file desciptor 19/05/2013 00:46:42 (+0700) | #6 | 275812
explorer88
Member

[Minus]    0    [Plus]
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
[Profile] [PM]

Mr.Khoai wrote:
Hello explorer88,

Bạn thử ghi dữ liệu vào fd 0 của script bằng cách nào? Vô hiệu là vô hiệu sao?

khoai 


Hôm nay lặp lại thí nghiệm em thử echo "text" > /proc/PID/fd/0 hay mở file 0 ra bằng vi rồi ghi thẳng lên thì thấy dữ liệu đẩy thẳng vào terminal của em. Không hiểu sao trước mình làm gì mà không được nhỉ smilie Kiếm tra thì thấy các file 0,1,2 đều là symbolic link trỏ đến terminal mà em đang chạy script nên việc dữ liệu hiển thị thế là đúng rồi.

Nhưng ở đây em thấy có một điều lạ là em đẩy dữ liệu vào có dấu xuống dòng echo -e "test\n" hay echo -e "test\n\r" thì script của em vẫn không kết thúc lệnh đọc dữ liệu.

Code:
#!/bin/bash
echo "pid = $$"
read -p "Enter name: " test
echo $test
exit 0


Em phải vô trong terminal đang chạy script gõ trực tiếp test rồi enter thì đoạn đợi nhập mới qua. Lúc này biến test được in chỉ chứa những gì em nhập trực tiếp còn những gì em echo vào fd0 đều không có. Vậy thì file 0 đó đâu phải là stdin của process đâu ? Nó chỉ là đường tắt đến terminal. Sao chả thấy ăn nhập với lý thuyết gì cả, lùng bùng hết cả lên, các anh có chỉ dẫn gì hay có tài liệu gì về file descriptor không ạ ?



[Up] [Print Copy]
  [Question]   Hỏi đáp về file desciptor 19/05/2013 12:51:38 (+0700) | #7 | 275818
bino1810
Member

[Minus]    0    [Plus]
Joined: 10/02/2012 10:38:28
Messages: 61
Location: /home/cuonglm
Offline
[Profile] [PM]
Nhưng ở đây em thấy có một điều lạ là em đẩy dữ liệu vào có dấu xuống dòng echo -e "test\n" hay echo -e "test\n\r" thì script của em vẫn không kết thúc lệnh đọc dữ liệu. 


Đúng rồi bạn, bạn echo như vậy thì script không kết thúc đâu, đọc man của read, bạn sẽ thấy:

Code:
On success, the number of bytes read is returned (zero indicates end of file)


Bạn thử làm lại như trên, nhưng đến bước echo -e thì thêm lệnh strace vào để xem sẽ thấy kết quả:

Code:
write(1, "test\n", 5)                   = 5
write(1, "\n", 1)                       = 1
close(1)                                = 0
munmap(0x7f8be7e52000, 4096)            = 0
close(2)                                = 0
exit_group(0)                           = ?


Rất đúng với lý thuyết, return value là 5 bytes, khác 0 --> read hiểu rằng chưa phải EOF.


Còn việc

Em phải vô trong terminal đang chạy script gõ trực tiếp test rồi enter thì đoạn đợi nhập mới qua. Lúc này biến test được in chỉ chứa những gì em nhập trực tiếp còn những gì em echo vào fd0 đều không có. Vậy thì file 0 đó đâu phải là stdin của process đâu ? 


thì hơi vô lý, bạn thử check xem có khi nào bạn chạy lại script rồi, lúc này nó có PID khác nhưng bạn vẫn echo vào PID cũ không?
There is more than one way to do it!
[Up] [Print Copy]
  [Question]   Hỏi đáp về file desciptor 20/05/2013 20:31:13 (+0700) | #8 | 275845
explorer88
Member

[Minus]    0    [Plus]
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
[Profile] [PM]
Hình như bạn bino1810 nhầm thì phải, man của read bạn nói là của system call, còn read mình dùng là một built in command trong bash shell mà. Man cho built in read này thì mình tìm thấy ở đấy: http://wiki.bash-hackers.org/commands/builtin/read chứ không có trên máy.

Về câu hỏi mình nêu thì tiện đây, mình viết lại những thu lượm của mình luôn. Hi vọng sẽ có ích cho các bạn có cùng bối rối.

Mình có nói là tất cả những gì mình echo đẩy vào fd0 đều không được nhận vào input data cho shell script mình viết, bằng chứng là lệnh read -p không kết thúc cho đến khi mình nhập trực tiếp và biến test chỉ nhận những gì gõ trực tiếp qua terminal. Lý do ở đây là mình đang truyền dữ liệu vào terminal chứ không phải là process đang chạy script của mình. Ở đây terminal hay bash shell cũng chính là parent của process đang chạy script. Một process được sinh ra trên linux bằng cách sử dụng fork. Tìm đọc trong man fork thì được biết parent và child process sẽ chia sẻ nhau file descriptor.

File descriptor lúc nào cũng trỏ đến một file. Khi nào lệnh thực hiện có kèm với wwwection thì những file descriptor này sẽ thay đổi trỏ đến file muốn dùng làm input data, output hay err. Mình có viết thử một script chạy liên tục echo "text" > fileTest.txt và một script nữa cũng chạy liên tục song song với script trên chỉ với nhiệm vụ là ls -l /proc/PID of script/fd > output. Sau khi xem trong file kết quả output lệnh ls -l trên thì thấy fd1 thay đổi trỏ đến fileTest.txt

Quay về vấn đề của mình, mục đích ban đầu của mình là kiểm tra xem liệu có thể đẩy input data trực tiếp vào fd0 không. Lúc này mình thấy fd0 của child process kế thừa từ parent luôn trỏ đến terminal nên mình thử thay đổi file trỏ bởi fd0 của child ngay từ trong script:

Code:
echo "test123test" > ~/input.txt


Code:
#!/bin/bash
echo "pid = $$"
exec 0<"/home/username/input.txt"
read -p "Enter name: " test
echo "--->$test<----"
exit 0


Kết quả là bước đợi nhập bàn phím của read -p bị bỏ qua và hiện ra --->test123test<---
Lý do bước read -p bị bỏ qua vì lệnh read -p sẽ kết thúc khi gặp ký tự xuống dòng. Mình đẩy dữ liệu vào input.txt bằng echo nên mặc định ở cuối có ký tự \n. Trường hợp mình dùng echo -n để loại ký tự xuống dòng trong input.txt thì lệnh read -p vẫn bị bỏ qua. Lúc này lý do lại bởi system call read trả về 0 -> EOF nên kết thúc việc đọc. Cái này mình biết được cũng nhờ mình kiểm tra bằng lệnh strace mà bạn bino1810 có nhắc đến smilie

Cám ơn bạn bino1810 và mọi người đã giúp đỡ.
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|