perlfork - Trực tuyến trên đám mây

Đây là lệnh perlfork có thể được chạy trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks bằng cách sử dụng một trong nhiều máy trạm trực tuyến miễn phí của chúng tôi như Ubuntu Online, Fedora Online, trình giả lập trực tuyến Windows hoặc trình mô phỏng trực tuyến MAC OS

CHƯƠNG TRÌNH:

TÊN


perlfork - Perl's fork () giả lập

SYNOPSIS


LƯU Ý: Kể từ bản phát hành 5.8.0, mô phỏng fork () đã đáng kể
trưởng thành. Tuy nhiên, vẫn còn một số lỗi và sự khác biệt đã biết
từ ngã ba thực () có thể ảnh hưởng đến bạn. Xem "BUGS" và
Phần "CAVEATS VÀ GIỚI HẠN" bên dưới.

Perl cung cấp một cái nĩa() từ khóa tương ứng với lệnh gọi cùng tên của hệ thống Unix.
Trên hầu hết các nền tảng giống Unix, nơi cái nĩa() cuộc gọi hệ thống có sẵn, Perl's cái nĩa()
chỉ đơn giản là gọi nó.

Trên một số nền tảng như Windows, nơi cái nĩa() cuộc gọi hệ thống không khả dụng, Perl có thể
được xây dựng để thi đua cái nĩa() ở cấp độ thông dịch viên. Trong khi mô phỏng được thiết kế để
tương thích nhất có thể với thực tế cái nĩa() ở cấp độ của chương trình Perl, có
là những điểm khác biệt quan trọng nhất định bắt nguồn từ thực tế là tất cả những đứa trẻ giả
"quy trình" được tạo theo cách này sống trong cùng một quy trình thực khác với hệ điều hành
là có liên quan.

Tài liệu này cung cấp tổng quan chung về các khả năng và hạn chế của
cái nĩa() sự thi đua. Lưu ý rằng các vấn đề được thảo luận ở đây không áp dụng cho các nền tảng
nơi nào có thật cái nĩa() có sẵn và Perl đã được cấu hình để sử dụng nó.

MÔ TẢ


Sản phẩm cái nĩa() mô phỏng được thực hiện ở cấp độ của trình thông dịch Perl. Điều này có nghĩa là gì
nói chung là chạy cái nĩa() thực sự sẽ sao chép trình thông dịch đang chạy và tất cả
trạng thái và chạy trình thông dịch được nhân bản trong một chuỗi riêng biệt, bắt đầu thực thi trong
chỉ sau điểm mà cái nĩa() đã được gọi trong cha mẹ. Chúng tôi sẽ tham khảo
luồng thực hiện "quy trình" con này là quy trình giả.

Đối với chương trình Perl đã gọi cái nĩa(), tất cả điều này được thiết kế để minh bạch. Các
cha mẹ trả lại từ cái nĩa() với một ID quy trình giả mà sau đó có thể được sử dụng trong
bất kỳ chức năng thao tác quy trình nào; đứa trẻ trở về từ cái nĩa() với giá trị từ 0 đến
biểu thị rằng đó là quá trình giả con.

Hành vi of khác Perl Tính năng, đặc điểm in rèn quy trình giả
Hầu hết các tính năng Perl hoạt động theo cách tự nhiên trong các quy trình giả.

$$ hoặc $ PROCESS_ID
Biến đặc biệt này được đặt đúng thành ID quá trình giả. Nó có thể được sử dụng
để xác định các quy trình giả trong một phiên cụ thể. Lưu ý rằng giá trị này là
phải tái chế nếu bất kỳ quy trình giả nào được khởi chạy sau khi những quy trình khác đã được
đợi đã()-ed vào.

% ENV Mỗi tiến trình giả duy trì môi trường ảo của riêng nó. Các sửa đổi đối với% ENV
ảnh hưởng đến môi trường ảo và chỉ hiển thị trong quá trình giả đó,
và trong bất kỳ quy trình nào (hoặc quy trình giả) được khởi chạy từ nó.

chdir () và tất cả các nội trang khác chấp nhận tên tệp
Mỗi tiến trình giả duy trì ý tưởng ảo của riêng nó về thư mục hiện tại.
Các sửa đổi đối với thư mục hiện tại bằng cách sử dụng chdir () chỉ hiển thị trong đó
quá trình giả và trong bất kỳ quá trình nào (hoặc quá trình giả) được khởi chạy từ nó. Tất cả
các truy cập tệp và thư mục từ quy trình giả sẽ ánh xạ chính xác
thư mục làm việc đến thư mục làm việc thực một cách thích hợp.

đợi đã()Waitpid ()
đợi đã()Waitpid () có thể được thông qua một ID quy trình giả được trả về bởi cái nĩa(). Kia là
các cuộc gọi sẽ đợi đúng cách cho sự kết thúc của quá trình giả và trả về
trạng thái.

giết chết() "kill ('KILL', ...)" có thể được sử dụng để kết thúc một quá trình giả bằng cách chuyển cho nó ID
trả lại bởi cái nĩa(). Kết quả của việc giết người trong một quá trình giả là không thể đoán trước và
nó không nên được sử dụng trừ những trường hợp nghiêm trọng, bởi vì hoạt động
hệ thống có thể không đảm bảo tính toàn vẹn của tài nguyên quy trình khi một chuỗi đang chạy
Bị chấm dứt. Quá trình thực hiện các quá trình giả có thể bị chặn
và trình thông dịch Perl bị treo. Lưu ý rằng sử dụng "kill ('KILL', ...)" trên
giảtiến trình() thường có thể gây ra rò rỉ bộ nhớ, bởi vì chuỗi
việc triển khai quá trình giả không có cơ hội dọn dẹp tài nguyên của nó.

"kill ('TERM', ...)" cũng có thể được sử dụng trên các quy trình giả, nhưng tín hiệu sẽ không
được gửi trong khi quá trình giả bị chặn bởi lệnh gọi hệ thống, ví dụ: chờ đợi
để kết nối ổ cắm hoặc cố gắng đọc từ ổ cắm không có sẵn dữ liệu.
Bắt đầu từ Perl 5.14, quy trình dành cho cha mẹ sẽ không đợi con cái thoát ra một lần
chúng đã được báo hiệu bằng "kill ('TERM', ...)" để tránh bế tắc trong quá trình
lối ra. Bạn sẽ phải gọi một cách rõ ràng Waitpid () để đảm bảo trẻ có thời gian
để tự dọn dẹp, nhưng bạn cũng phải chịu trách nhiệm rằng đứa trẻ không
chặn trên I / O.

hành () đang gọi hành () trong một quy trình giả thực sự tạo ra tệp thực thi được yêu cầu trong
một quá trình riêng biệt và đợi nó hoàn thành trước khi thoát ra với cùng một lối ra
trạng thái như quy trình đó. Điều này có nghĩa là ID quy trình được báo cáo trong
chạy thực thi sẽ khác với Perl trước đó cái nĩa() có thể có
trả lại. Tương tự, bất kỳ chức năng thao tác quy trình nào được áp dụng cho ID
trả lại bởi cái nĩa() sẽ ảnh hưởng đến quá trình giả chờ đợi được gọi là hành (), Chứ không phải
quá trình thực sự nó đang chờ đợi sau hành ().

Thời Gian hành () được gọi bên trong một quá trình giả, sau đó là các phương thức DESTROY và các khối END
sẽ vẫn được gọi sau khi tiến trình bên ngoài quay trở lại.

lối ra() lối ra() luôn thoát khỏi quá trình giả đang thực thi, sau khi tự động
đợi đã()-ing cho bất kỳ quá trình giả con nổi bật nào. Lưu ý rằng điều này có nghĩa là
toàn bộ quá trình sẽ không thoát trừ khi tất cả các quá trình giả đang chạy đều có
đã thoát ra. Xem bên dưới để biết một số hạn chế với các bộ xử lý tệp đang mở.

Mở tay cầm đối với tệp, thư mục và ổ cắm mạng
Tất cả các tay cầm mở đều Dup ()-ed trong quy trình giả, để đóng bất kỳ xử lý nào trong
một quy trình không ảnh hưởng đến những quy trình khác. Xem bên dưới để biết một số hạn chế.

Tài nguyên giới hạn
Trong mắt của hệ điều hành, các quá trình giả được tạo thông qua cái nĩa() thi đua là
chỉ đơn giản là các chủ đề trong cùng một quá trình. Điều này có nghĩa là bất kỳ giới hạn cấp quy trình nào được áp đặt bởi
hệ điều hành áp dụng cho tất cả các quá trình giả được thực hiện cùng nhau. Điều này bao gồm bất kỳ
giới hạn do hệ điều hành áp đặt về số lượng tệp, thư mục và ổ cắm đang mở
xử lý, giới hạn sử dụng dung lượng ổ đĩa, giới hạn kích thước bộ nhớ, giới hạn sử dụng CPU, v.v.

Giết chết các cha mẹ quá trình
Nếu tiến trình gốc bị ngắt (sử dụng Perl's giết chết() nội trang, hoặc sử dụng một số
nghĩa là bên ngoài) tất cả các quá trình giả cũng bị giết và toàn bộ quá trình sẽ thoát.

Lifetime of các cha mẹ quá trình quy trình giả
Trong quá trình bình thường của các sự kiện, quy trình gốc và mọi quy trình giả bắt đầu bởi
nó sẽ đợi các giả con tương ứng của chúng hoàn thành trước khi chúng thoát. Điều này
có nghĩa là cha mẹ và mọi giả con được tạo bởi nó cũng là cha giả
sẽ chỉ thoát ra sau khi con giả của chúng đã thoát.

Bắt đầu với Perl 5.14, cha mẹ sẽ không đợi đã() tự động cho bất kỳ đứa trẻ nào đã
được báo hiệu bằng "kill ('TERM', ...)" để tránh bế tắc trong trường hợp trẻ đang chặn trên
I / O và không bao giờ nhận được tín hiệu.

THẬN TRỌNG GIỚI HẠN


BEGIN khối
Sản phẩm cái nĩa() mô phỏng sẽ không hoạt động hoàn toàn chính xác khi được gọi từ bên trong
BEGIN khối. Bản sao được phân nhánh sẽ chạy nội dung của khối BEGIN, nhưng sẽ
không tiếp tục phân tích luồng nguồn sau khối BEGIN. Ví dụ,
hãy xem xét đoạn mã sau:

BẮT ĐẦU {
ngã ba và lối ra; # fork con và thoát khỏi cha mẹ
in "bên trong \ n";
}
in "ngoài \ n";

Điều này sẽ in:

bên trong

hơn là mong đợi:

bên trong
bên ngoài

Hạn chế này xuất phát từ những khó khăn kỹ thuật cơ bản trong việc nhân bản và
khởi động lại các ngăn xếp được trình phân tích cú pháp Perl sử dụng ở giữa phân tích cú pháp.

Mở tệp xử lý
Bất kỳ bộ xử lý tệp nào mở tại thời điểm cái nĩa() sẽ được Dup ()-ed. Do đó, các tệp
có thể được đóng một cách độc lập trong cha và con, nhưng hãy lưu ý rằng Dup ()-ed
các tay cầm sẽ vẫn chia sẻ cùng một con trỏ tìm kiếm. Thay đổi vị trí tìm kiếm trong
cha mẹ sẽ thay đổi nó trong con và ngược lại. Người ta có thể tránh điều này bằng cách mở
các tệp cần con trỏ tìm kiếm riêng biệt riêng biệt trong phần con.

Trên một số hệ điều hành, đặc biệt là Solaris và Unixware, gọi "exit ()" từ
tiến trình con sẽ tuôn ra và đóng các bộ xử lý tệp đang mở trong tệp gốc, do đó
làm hỏng các bộ xử lý tệp. Trên các hệ thống này, nên gọi "_exit ()"
thay thế. "_exit ()" có sẵn trong Perl thông qua mô-đun "POSIX". Xin vui lòng
tham khảo trang web của hệ thống của bạn để biết thêm thông tin về điều này.

Mở điều khiển thư mục
Perl sẽ đọc hoàn toàn từ tất cả các chốt thư mục đang mở cho đến khi chúng đến cuối
của dòng. Sau đó nó sẽ seekdir () trở lại vị trí ban đầu và tất cả
tương lai readdir () các yêu cầu sẽ được thực hiện từ bộ đệm cache. Điều đó có nghĩa là
rằng không phải thư mục nào được xử lý bởi quy trình mẹ cũng như xử lý bởi
tiến trình con sẽ thấy bất kỳ thay đổi nào được thực hiện đối với thư mục sau cái nĩa()
gọi.

Lưu ý rằng rewinddir () có một giới hạn tương tự trên Windows và sẽ không buộc
readdir () để đọc lại thư mục. Chỉ một thư mục mới được mở
xử lý sẽ phản ánh các thay đổi đối với thư mục.

Ống nĩa mở() chưa được thực hiện
Các cấu trúc "open (FOO," | - ")" và "open (BAR," - | ")" chưa được triển khai.
Hạn chế này có thể dễ dàng khắc phục trong mã mới bằng cách tạo một đường ống
một cách rõ ràng. Ví dụ sau đây cho thấy cách viết thư cho một đứa trẻ được chia nhỏ:

# mô phỏng mở (FOO, "| -")
ống phụ_to_fork ($) {
$ cha mẹ của tôi = shift;
tẩu $ con của tôi, $ cha mẹ hoặc chết;
của tôi $ pid = fork ();
die "fork () không thành công: $!" trừ khi được định nghĩa $ pid;
nếu ($ pid) {
đóng $ con;
}
khác {
đóng $ cha;
mở (STDIN, "<& =". fileno ($ con)) hoặc chết;
}
$ pid;
}

if (pipe_to_fork ('FOO')) {
# cha mẹ
in FOO "pipe_to_fork \ n";
đóng FOO;
}
khác {
# đứa trẻ
trong khi ( ) { in; }
ra(0);
}

Và cái này đọc từ đứa trẻ:

# mô phỏng mở (FOO, "- |")
ống phụ_from_fork ($) {
$ cha mẹ của tôi = shift;
tẩu $ cha, $ con của tôi hoặc chết;
của tôi $ pid = fork ();
die "fork () không thành công: $!" trừ khi được định nghĩa $ pid;
nếu ($ pid) {
đóng $ con;
}
khác {
đóng $ cha;
mở (STDOUT, "> & =". fileno ($ con)) hoặc chết;
}
$ pid;
}

if (pipe_from_fork ('BAR')) {
# cha mẹ
trong khi ( ) { in; }
đóng BAR;
}
khác {
# đứa trẻ
print "pipe_from_fork \ n";
ra(0);
}

Ống nĩa mở() cấu trúc sẽ được hỗ trợ trong tương lai.

Trạng thái toàn cầu được duy trì bởi XSUBs
Các chương trình con bên ngoài (XSUB) duy trì trạng thái chung của riêng chúng có thể không hoạt động
một cách chính xác. Các XSUB như vậy sẽ cần duy trì khóa để bảo vệ đồng thời
truy cập vào dữ liệu toàn cầu từ các quy trình giả khác nhau hoặc duy trì tất cả trạng thái của chúng
trên bảng ký hiệu Perl, được sao chép tự nhiên khi cái nĩa() được gọi là. MỘT
cơ chế gọi lại cung cấp cho tiện ích cơ hội sao chép trạng thái của chúng
sẽ được cung cấp trong thời gian tới.

Trình thông dịch được nhúng trong ứng dụng lớn hơn
Sản phẩm cái nĩa() mô phỏng có thể không hoạt động như mong đợi khi nó được thực thi trong một
ứng dụng nhúng một trình thông dịch Perl và gọi các API Perl có thể đánh giá
các bit của mã Perl. Điều này xuất phát từ việc người thi đua chỉ có kiến ​​thức
về cấu trúc dữ liệu riêng của trình thông dịch Perl và không biết gì về
chứa trạng thái của ứng dụng. Ví dụ: bất kỳ trạng thái nào được thực hiện trên
ngăn xếp cuộc gọi riêng của ứng dụng nằm ngoài tầm với.

An toàn chuỗi của các tiện ích mở rộng
Kể từ khi cái nĩa() mô phỏng chạy mã trong nhiều luồng, phần mở rộng gọi vào
các thư viện không an toàn theo luồng có thể không hoạt động đáng tin cậy khi gọi cái nĩa(). Như Perl's
hỗ trợ phân luồng dần dần được chấp nhận rộng rãi hơn ngay cả trên các nền tảng có
tự nhiên cái nĩa(), các phần mở rộng như vậy dự kiến ​​sẽ được sửa để đảm bảo an toàn cho luồng.

KHẢ NĂNG THẬN TRỌNG


Trong mã Perl di động, "kill (9, $ child)" không được sử dụng trên các quy trình đã chia nhỏ. Giết một
quá trình fork không an toàn và có kết quả không thể đoán trước. Nhìn thấy "giết chết()", bên trên.

Sử dụng perlfork trực tuyến bằng các dịch vụ onworks.net



Các chương trình trực tuyến Linux & Windows mới nhất