- Phát triển data.frame theo cách hiệu quả về bộ nhớ
- phát hiện rò rỉ bộ nhớ ruby/ruby on rails
- Không thể giải quyết việc nhập android.support.v7.app
- Ổ cắm miền UNIX và bộ nhớ chia sẻ (tệp được ánh xạ)
Giả sử tôi có một cấu trúc C,DynApiArg_t
.
định nghĩa kiểu cấu trúc DynApiArg_s {
uint32_t m1;
...
uint32_t mx;
} DynApiArg_t;
Một con trỏ tới cấu trúc này được truyền như một tham số cho hàm nói
khoảng trống DynLibApi(DynApiArg_t *arg)
{
đối số->m1 = 0;
another_fn_in_the_lib(arg->mold); /* Có thể bị sập ở đây. (1) */
}
Có trong các thư viện động libdyn.so
ở giữa. API này có sẵn thông qua dlopen/dlsym
Quy trình gọi được gọi từ một tệp thực thi.
Nếu thư viện động này được cập nhật lên phiên bản 2, DynApiArg_t
Bây giờ có những thành viên mới, chẳng hạn như m2
, như được hiển thị bên dưới:
định nghĩa kiểu cấu trúc DynApiArg_s {
uint32_t m1;
OldMbr_t *khuôn;
...
uint32_t mx;
uint32_t m2;
MớiMbr *mnew;
} DynApiArg_t;
Nếu không có sự xây dựng lại hoàn chỉnh dlopen/dlsym
Một tệp thực thi hoặc thư viện khác gọi API này, mỗi khi tôi gọi API này, tôi thấy tiến trình bị sập do có sự tham chiếu đến một thành viên nào đó trong cấu trúc. Tôi biết việc truy cập m2 có thể là một vấn đề. Nhưng bạn có thể thấy rằng việc truy cập các thành viên như thế này khuôn
Sẽ gây ra sự cố.
định nghĩa void (*fnPtr_t)(DynApiArg_t*);
khoảng trống DynApiCaller(DynApiArg_t *arg)
{
void *libhdl = dlopen("libdyn.so", RTLD_LAZY | RTLD_GLOBAL);
fnPtr_t fptr = dlsym(libhdl, "DynLibApi");
fnptr(arg); /* cuộc gọi thực tế đến API được tải động (2) */
}
Khi gọi API thông qua fnptr, tại dòng được đánh dấu (2), khi truy cập thành viên cũ/hiện có tại (1) (trong v1 của lib, khi DynApiCaller được biên dịch ban đầu), đôi khi có thể có bất kỳ rác nào, thậm chí VÔ GIÁ TRỊ
.
Cách chính xác để xử lý các bản cập nhật như vậy mà không phải biên dịch lại hoàn toàn tệp thực thi mỗi khi thư viện phụ thuộc được cập nhật là gì?
Tôi đã thấy các thư viện được đặt tên bằng liên kết tượng trưng, với số phiên bản như libsolid.so.4
. Có bất cứ điều gì liên quan đến hệ thống kiểm soát phiên bản này có thể giúp tôi không? Nếu vậy, bạn có thể chỉ cho tôi tài liệu chính xác về những điều này không?
1 Câu trả lời
Có nhiều cách để giải quyết vấn đề này:
Bao gồm phiên bản API trong tên thư viện động.
Việc sử dụng của bạn dlopen("libfoo.so.4")
Còn hơn là dlopen("libfoo.so")
. Các phiên bản chính khác nhau của thư viện về cơ bản là độc lập và có thể cùng tồn tại trên cùng một hệ thống; do đó, tên gói của thư viện sẽ là ví dụ:thư viện foo-4
. Bạn có thể cài đặt cả hai libfoo.so.4
Và libfoo.so.5
. Phiên bản nhỏ hơn, ví dụ: thư viện foo-4.2
,Cài đặt libfoo.so.4.2
, Và libfoo.so.4
Liên kết tượng trưng đến libfoo.so .4.2
.
Ban đầu, hãy xác định cấu trúc với phần đệm bằng không (yêu cầu trong các phiên bản trước của thư viện) và để các phiên bản sau sử dụng lại các trường đệm nhưng vẫn giữ nguyên kích thước cấu trúc.
<Sử dụng tên tượng trưng cho phiên bản. Đây là một tiện ích mở rộng của Linux sử dụng dlvsym()
.Một thư viện nhị phân chia sẻ duy nhất có thể triển khai nhiều phiên bản của cùng một ký hiệu động.
sử dụng chức năng giải quyếtCác ký hiệu được xác định tại thời điểm tải. Điều này cho phép, ví dụ, các biến thể chức năng được tối ưu hóa được chọn khi chạy cho kiến trúc phần cứng, nhưng dlopen()
Phương pháp này không thực sự hữu ích.
Sử dụng cấu trúc để mô tả API thư viện và sử dụng các hàm có phiên bản để lấy/khởi tạo API đó.
Ví dụ, phiên bản 4 của thư viện của bạn có thể triển khai
cấu trúc libfoo_api {
int (*func1)(int arg1, int arg2);
dữ liệu kép;
khoảng trống (*func2)(khoảng trống);
/* ... */
};
và chỉ xuất ra một biểu tượng,
int libfoo_init(struct libfoo_api *const api, const int phiên bản);
Gọi hàm này sẽ khởi tạo các ký hiệu được hỗ trợ. Giao diện lập trình ứng dụng (API)
cấu trúc, giả sử rằng cấu trúc tương ứng với phiên bản đã chỉ định. Thư viện chia sẻ có thể hỗ trợ nhiều phiên bản. Nếu phiên bản nào đó không được hỗ trợ, hệ thống sẽ trả về lỗi.
Điều này đặc biệt hữu ích cho các giao diện loại plugin (mặc dù _khởi tạo
Các hàm có nhiều khả năng gọi các hàm đăng ký hàm do ứng dụng cung cấp hơn là điền vào các cấu trúc), vì một tệp duy nhất có thể chứa nhiều phiên bản của các hàm được tối ưu hóa, được tối ưu hóa cho nhiều kiến trúc phần cứng tương thích (ví dụ: kiến trúc AMD/Intel có hỗ trợ SSE/AVX/AVX2/AVX512 khác nhau).
Lưu ý rằng các chi tiết triển khai ở trên có thể được "ẩn" trong các tệp tiêu đề, giúp mã C thực tế sử dụng thư viện chia sẻ trở nên đơn giản hơn. Nó cũng giúp cho cùng một API hoạt động trên nhiều hệ điều hành, chỉ bằng cách thay đổi các tệp tiêu đề để sử dụng các phương thức hoạt động tốt nhất trên hệ điều hành đó, trong khi vẫn giữ nguyên giao diện C thực tế.
Liên quan đến c - xây dựng lại thư viện động khi tham số typedef thay đổi, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/45467653/
Thân gửi các bạn: Ngày 18 tháng 3 năm 2014. Tôi đang giải quyết một tình huống khi sử dụng ng-repeat, các phần tử bên trong một mảng (mà tôi lấy từ chuỗi Json) thay đổi thứ tự ban đầu của chúng. Cần phải rõ ràng rằng mảng
Có rất nhiều câu hỏi hỏi về cách thay đổi lớp của div trong trình xử lý nhấp chuột JavaScript, ví dụ ở đây: Thay đổi kiểu Div onclick. Tôi hiểu điều đó rất tốt (chỉ cần thay đổi .className) và nó hoạt động
Tôi đã nhập cơ sở dữ liệu từ Access vào MySQL, nhưng một trong các bảng có tên cột là "Number of Shares" có dấu cách, mặc dù tôi đã thử thay đổi, thay thế hoặc thậm chí xóa tên cột nhưng không được. Có ai có thể giúp giải quyết vấn đề này không String UpdateQuary = "U
Tôi đang làm việc trên một yếu tố ngẫu nhiên của trường học. Hiện tại, tôi có một trang với hai mã CSS. Một cho chế độ xem bình thường và một cho chế độ xem bị vô hiệu hóa. Trang này cũng bao gồm hai nút sẽ thay đổi kiểu bảng được sử dụng. chức năng c
Tôi cần thay đổi văn bản trong một phần tử HTML bằng javascript, nhưng tôi không biết cách thực hiện. ¿ Có giúp được gì không? Tôi định nghĩa nó như thế này: Văn bản tôi muốn thay đổi. Tôi đang cố gắng làm điều này: docum
Tôi có một thanh điều hướng chính nằm trong tệp riêng nav_bar.shtml mà mọi trang khác đều có. Thanh menu là thanh menu jQuery (ApyCom là tên công ty bán các thanh điều hướng này). Cách xác định các thành phần trên thanh điều hướng
Tôi đang loay hoay với mã của mình và bắt đầu tự hỏi liệu thay đổi từ: if(array[index] == 0) thành: if(!array[index] != 0) có thể ảnh hưởng đến bất kỳ mã nào hay không, hay nó chỉ thực hiện cùng một chức năng và tôi không cần nó.
Tôi đang cố gắng tìm cách thay đổi kích thước cửa sổ bảng điều khiển. Sau đây là mã cho hàm tôi đang sử dụng: #include #include #define WIDTH 70 #define HEIGHT 35 HANDLE wHnd;
Tôi gặp nhiều tình huống dẫn đến cùng một hộp thông báo cảnh báo. Có giải pháp nào dễ hơn/tốt hơn là thực hiện nhiều câu lệnh if không? SẢN PHẨM BOX1 BOX2 BOX3
Tôi có XELEMENT B Bob Petier 19310227 1 chứa các phần tử này và tôi muốn chuyển đổi tiền tố như thế này. B Bob Thú Cưng
Tôi gặp phải tình huống này khi sử dụng MySQL 5.6: Truy vấn này hoạt động và trả về kết quả mong đợi: select * from some_table where a = 'b' and metadata->>"$.countr
Tôi tự hỏi liệu có ai biết gói hoặc hàm nào có thể phát hiện bất kỳ sự thay đổi nào trong định dạng của cột ngày tháng trong R không, tức là phát hiện nơi định dạng của vectơ ngày tháng thay đổi, ví dụ: 11/2/90 12/2/90 . . . 15/Feb/1990 16/Feb/1990 .
Tôi muốn có thể thay đổi nhãn của GtkButton sau khi tiện ích được hiển thị char *ButtonStance == "Connect"; GtkWidget *EntryButton = gtk_button_ne
Tôi đang sử dụng bo mạch phát triển FPGA Altera DE2 và cố gắng sử dụng cổng thẻ SD và đường ra âm thanh. Tôi đang lập trình bằng VHDL và C nhưng tôi gặp khó khăn với phần C do thiếu kinh nghiệm/kiến thức. Hiện tại, tôi có thể
Sau khi nhận thấy liên kết này: http://www.newscientist.com/blogs/nstv/2010/12/best-videos-of-2010-progress-bar-illusion.h
Tôi muốn biết trong một số trường hợp, ansible sẽ hiển thị "changed=0" ngay cả khi tác vụ playbook đã được thực thi thành công và ok=2. Điều này xảy ra khi sử dụng Rest API và mô-đun uri. Tôi đã cố gắng tìm lời giải thích nhưng vô ích. Ai có thể nói
Câu hỏi này đã có câu trả lời: Đã đóng cách đây 12 năm. Có thể trùng lặp: thêm nút vào cảnh báo thông báo đẩy Có thể chỉ định các nút để cảnh báo thông báo đẩy trong hộp cảnh báo được hiển thị bởi thông báo từ xa không?
Khi bạn có nhiều hơn 5 View Controller trong TabBarController, hệ thống sẽ tự động thiết lập View "More" cho bạn. Có thể thay đổi màu của thanh điều hướng trong Chế độ xem này để phù hợp với màu tôi đang sử dụng không?
Làm thế nào tôi có thể thay đổi vị trí của thư mục .AndroidStudioBeta, theo mặc định nằm tại \..\User\.AndroidStudioBeta trong Windows, mà không làm hỏng bất cứ thứ gì? /Sửa: Tìm
Hiện tại tôi đang cố gắng áp dụng phong cách lập trình chức năng hơn cho một dự án liên quan đến phát triển GUI cấp thấp (dựa trên LWJGL). Rõ ràng là trong trường hợp này, có rất nhiều trạng thái cần phải được lưu giữ và có thể thay đổi được trong phiên bản hiện tại. Mục tiêu của tôi cuối cùng là có một trạng thái hoàn toàn không thể thay đổi để tránh
Tôi là một lập trình viên xuất sắc, rất giỏi!