[Question] Hỏi đáp về file desciptor |
03/05/2013 15:32:08 (+0700) | #1 | 275407 |
explorer88
Member
|
0 |
|
|
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
|
|
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 ạ ? |
|
|
|
|
[Question] Hỏi đáp về file desciptor |
05/05/2013 14:09:05 (+0700) | #2 | 275460 |
explorer88
Member
|
0 |
|
|
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
|
|
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ơ ( |
|
|
|
|
[Question] Hỏi đáp về file desciptor |
05/05/2013 15:34:21 (+0700) | #3 | 275461 |
Stanley_00
Member
|
0 |
|
|
Joined: 01/03/2011 06:21:38
Messages: 74
Offline
|
|
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. |
|
|
|
|
[Question] Hỏi đáp về file desciptor |
05/05/2013 23:02:32 (+0700) | #4 | 275474 |
explorer88
Member
|
0 |
|
|
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
|
|
Ừ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ế |
|
|
|
|
[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
|
|
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 |
|
|
|
|
[Question] Hỏi đáp về file desciptor |
19/05/2013 00:46:42 (+0700) | #6 | 275812 |
explorer88
Member
|
0 |
|
|
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
|
|
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ỉ 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 ạ ?
|
|
|
|
|
[Question] Hỏi đáp về file desciptor |
19/05/2013 12:51:38 (+0700) | #7 | 275818 |
bino1810
Member
|
0 |
|
|
Joined: 10/02/2012 10:38:28
Messages: 61
Location: /home/cuonglm
Offline
|
|
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! |
|
|
|
[Question] Hỏi đáp về file desciptor |
20/05/2013 20:31:13 (+0700) | #8 | 275845 |
explorer88
Member
|
0 |
|
|
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
|
|
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
Cám ơn bạn bino1810 và mọi người đã giúp đỡ. |
|
|
|
|
|
|
|
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|
|
|