<![CDATA[Latest posts for the topic "Hỏi đáp về file desciptor"]]> /hvaonline/posts/list/24.html JForum - http://www.jforum.net Hỏi đáp về file desciptor /hvaonline/posts/list/44673.html#275407 /hvaonline/posts/list/44673.html#275407 GMT Hỏi đáp về file desciptor /hvaonline/posts/list/44673.html#275460 /hvaonline/posts/list/44673.html#275460 GMT Hỏi đáp về file desciptor /hvaonline/posts/list/44673.html#275461 /hvaonline/posts/list/44673.html#275461 GMT Hỏi đáp về file desciptor /hvaonline/posts/list/44673.html#275474 /hvaonline/posts/list/44673.html#275474 GMT Hỏi đáp về file desciptor /hvaonline/posts/list/44673.html#275682 /hvaonline/posts/list/44673.html#275682 GMT Hỏi đáp về file desciptor

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ỉ :D 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 ạ ? ]]>
/hvaonline/posts/list/44673.html#275812 /hvaonline/posts/list/44673.html#275812 GMT
Hỏi đáp về file desciptor 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?]]>
/hvaonline/posts/list/44673.html#275818 /hvaonline/posts/list/44673.html#275818 GMT
Hỏi đáp về file desciptor 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 đỡ.]]>
/hvaonline/posts/list/44673.html#275845 /hvaonline/posts/list/44673.html#275845 GMT