Tôi có một quy trình chạy dài và tôi cần nó để khởi chạy một quy trình khác (quá trình này sẽ chạy trong một thời gian tốt). Tôi chỉ cần bắt đầu nó, và sau đó hoàn toàn quên nó đi.Làm thế nào để bắn và quên một tiến trình con?
Tôi quản lý để làm những gì tôi cần bằng cách lấy một số mã từ cuốn sách Lập trình Ruby, nhưng tôi muốn tìm ra cách tốt nhất/đúng và hiểu những gì đang diễn ra. Dưới đây là những gì tôi nhận ban đầu:
exec("whatever --take-very-long") if fork.nil?
Process.detach($$)
Vì vậy, đây là đường đi, hoặc làm thế nào khác tôi nên làm điều đó?
Sau khi kiểm tra các câu trả lời dưới đây tôi đã kết thúc với mã này, mà dường như có ý nghĩa hơn:
(pid = fork) ? Process.detach(pid) : exec("foo")
Tôi đánh giá cao một số giải thích về cách fork
công trình. [đã nhận được điều đó]
Đã tách rời $$
phải không? Tôi không biết tại sao nó lại hoạt động, và tôi thực sự thích nắm bắt tình hình tốt hơn.
Ok, tôi nghĩ mình đã có .nil? kiểm tra. Trong đứa trẻ nó không thực sự trả về 0, nó trả về nil. Vì vậy, exec sẽ chạy nếu bạn đang ở trong đứa trẻ. Vì vậy, sau đó, làm thế nào tôi sẽ nắm bắt được sự trở lại khác của ngã ba, một trong đó trả về id của quá trình con? Bằng cách này tôi có thể sử dụng nó trực tiếp thay vì dựa vào $$. – kch
chỉ cần gọi ngã ba và chụp kết quả. sau đó nếu bạn có nil, làm exec, khác bạn đang ở trong phụ huynh. – Alnitak
Đây là định nghĩa rõ ràng và ngắn gọn về 'ngã ba'. Công việc tuyệt vời, cảm ơn bạn. – KomodoDave