Tôi đang cố gắng để sinh ra một quy trình mới từ dự án C++ của tôi bằng cách sử dụng fork-exec. Tôi đang sử dụng fork-exec để tạo ra một ống hai chiều cho quá trình con. Nhưng tôi sợ tài nguyên của tôi trong quá trình chia rẽ sẽ không được giải phóng đúng cách, vì cuộc gọi exec sẽ hoàn toàn tiếp quản quá trình của tôi và sẽ không gọi bất kỳ kẻ hủy diệt nào.Phát hành tài nguyên C++ và fork-exec?
Tôi đã cố gắng phá vỡ điều này bằng cách ném một ngoại lệ và gọi execl từ một khối catch ở cuối của chính, nhưng giải pháp này không phá hủy bất kỳ đơn.
Có cách nào hợp lý để đạt được điều này một cách an toàn không? (Hy vọng tránh bất kỳ hacks atExit)
Ex: Các đầu ra đoạn mã sau:
We are the child, gogo!
Parent proc, do nothing
Destroying object
Mặc dù quá trình chia hai còn có một bản sao của singleton mà cần phải được destructed trước khi tôi gọi execl.
#include <iostream>
#include <unistd.h>
using namespace std;
class Resources
{
public:
~Resources() { cout<<"Destroying object\n"; }
};
Resources& getRes()
{
static Resources r1;
return r1;
}
void makeChild(const string &command)
{
int pid = fork();
switch(pid)
{
case -1:
cout<<"Big error! Wtf!\n";
return;
case 0:
cout<<"Parent proc, do nothing\n";
return;
}
cout<<"We are the child, gogo!\n";
throw command;
}
int main(int argc, char* argv[])
{
try
{
Resources& ref = getRes();
makeChild("child");
}
catch(const string &command)
{
execl(command.c_str(), "");
}
return 0;
}
Bạn đang nói về tài nguyên nào? Chủ yếu tập tin mô tả tồn tại exec(), mà bạn có thể đánh dấu close-on-exec để hạt nhân đóng chúng cho bạn. http://pubs.opengroup.org/onlinepubs/009695399/functions/exec.html –
Nhân tiện, nếu destructors được gọi trong đứa trẻ được chia đôi cũng như trong phụ huynh, nó sẽ kết thúc gọi các nhà xây dựng một lần (trong phụ huynh) và destructors hai lần (cả trong phụ huynh và đứa trẻ). –
Tôi tin rằng tôi đang nhận được nguy hiểm gần với hành vi không xác định ở đây, nhưng lớp Tài nguyên đại diện cho một số lớp đơn tôi sử dụng để gói C-thư viện vào RAII-đối tượng. Và nếu ngã ba thực sự sao chép toàn bộ trạng thái quá trình, thì có lẽ tôi nên gọi các RAII-destructors trước khi tôi gọi exec(). Điều này tất nhiên sẽ trở nên điên rồ nếu các tài nguyên nằm ngoài chương trình (như kết nối cơ sở dữ liệu). Nhưng vì chúng là thư viện, tôi tin rằng chúng nên được phát hành trong cả phụ huynh và tiến trình con. [Nếu nó giúp, tôi hiện đang gói ncurses, nscapi và SDL thành singletons] – Phog