- 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ạ)
hiện hữu
Các định nghĩa sau đây được đưa ra:
#define SIG_ERR (void (*)())-1
#define SIG_DFL (void (*)())0
#define SIG_IGN (void (*)())1
Tôi nghĩvô hiệu (*)()
Chỉ ra rằng đó là một con trỏ hàm có kiểu trả về là void và tham số là void (vì không có gì giữa dấu ngoặc đơn).
Nhưng trongtín hiệu()
Hàm, loại tham số thứ hai làvoid (*func)(int)
.
Vậy, tại sao định nghĩa của ba điều trênvô hiệu (*)()
.Ngoài ra, số -1
Điều này có nghĩa là gì? 0
1
Theo định nghĩa thì sao?
Làm thế nào để hiểu những định nghĩa này?
1 Câu trả lời
Định nghĩa của bạn khác với tôi. Nếu tôi xử lý trước tệp sau:
#include
SIG_IGN
SIG_DFL
SIG_ERR
3 dòng cuối cùng trong đầu ra của bộ xử lý trước là
% gcc -E sigtest.c|đuôi -n3
((__người thở dài_t) 1)
((__người giữ cửa_t) 0)
((__sighandler_t) -1)
Định nghĩa kiểu là
typedef __signalfn_t *__sighandler_t;
Và
kiểu dữ liệu void __signalfn_t(int);
Từ asm-generic/signal-defs.h
. Vậy thì bạn hẳn phải có một số danh hiệu cũ.
Tuy nhiên, đây không phải là C++, mà là C. Dấu ngoặc rỗng trong C có nghĩa là tham số hàm không được khai báo/hàm có thể nhận bất kỳ số lượng tham số nào. Điều này được coi là lỗi thời kể từ tiêu chuẩn C89. Tuy nhiên,vô hiệu (*)()
Các giá trị của kiểu sẽ là khoảng trống (*)(int)
tương thích.
Các giá trị -1, 0 và 1 là các hằng số ma thuật không thể di chuyển và chỉ có ý nghĩa đối với hạt nhân Linux.
Liên quan đến định nghĩa của c - SIG_IGN, SIG_DFL, SIG_ERR, 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/35828466/
Đặt trình xử lý tín hiệu thành SIG_IGN sẽ khiến tín hiệu bị bỏ qua khi chạy chương trình bình thường, nhưng không phải khi chạy chương trình thông qua gdb. Tôi đang tạo bộ đếm thời gian bằng các hàm timer_create và timer_settime. Tôi không
Tôi đang thử nghiệm giải pháp chống gỡ lỗi bằng phương thức ptrace int main(int argc, char **argv) { void *handle; long (*go)(enum __p
#define SIG_IGN (void (*)(int))1 #define SIG_HOLD (void (*)(int))5 #define SIG_ERR ((void
Tôi có một tiến trình chính và một số tiến trình con được sinh ra từ tiến trình đó. Đến một thời điểm nào đó, tôi phải gửi tín hiệu SIGINT đến tất cả các tiến trình con thay vì tiến trình chính. Tôi không thể lưu trữ pid cho tất cả các tiến trình con. Vì vậy, tôi sử dụng SIG_IGN trong quy trình chính để bỏ qua SIGINT và
Tôi biết mục đích tương ứng của SIGPIPE và SIGIGN. Signal(SIGPIPE, SIG_IGN); có tác dụng gì? Câu trả lời tốt nhất là signal(SIGPIPE, SIG_IGN); đơn giản là bỏ qua tín hiệu.
Trong các định nghĩa sau: #define SIG_ERR (void (*)())-1 #define SIG_DFL (void (*)())0 #define SIG_IGN (void (*)())1
Tôi đã tham gia một dự án cũ và tìm thấy dòng này - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NS
Tôi đang cố gắng viết một số mã để sử dụng python để thực hiện một số gói tin đánh hơi bằng pyshark. Tôi có đoạn mã sau: import pyshark print('Pyshark demo') capture =
POSIX.1-2017 chỉ định trong XSH 2.4.3 SIG_IGN rằng hành vi của một quy trình không được xác định sau khi nó bỏ qua SIG
Tôi đã chặn và sau đó chờ tín hiệu thông qua mã sau: sigset_t set; sigfillset(&set); // tất cả các tín hiệu sigprocmask(SIG_SETMASK, &set, NU
Tôi là một lập trình viên xuất sắc, rất giỏi!