2013-04-13 30 views
15

Tôi hoàn toàn noob trong c. Tôi phải viết một hàm mypause() cần có chức năng tương tự như lệnh gọi hệ thống pause() và kiểm tra chức năng mypause() trong chương trình liên tục chặn chờ tín hiệu. Cách hoạt động của chức năng te pause() ?? Tôi không thể chỉ làm một số mypause() như thế này:Cách pause() hoạt động?

để chương trình chặn và chờ tín hiệu?

Hãy nhớ rằng tôi không bao giờ có thể sử dụng pause() hoặc sigpause().

+0

Vì vậy, bạn muốn đợi đột quỵ chính? – m0skit0

+1

Âm thanh như một câu hỏi về bài tập về nhà. Nên được gắn thẻ như vậy? Dù sao, tôi nghĩ rằng bạn đã không hoàn toàn hiểu được vấn đề bạn muốn giải quyết. Cuộc gọi pause() KHÔNG đợi đầu vào của người dùng. –

+0

I.e. các sự kiện bàn phím không phải là tín hiệu theo ý nghĩa ở đây. –

Trả lời

13

Các khối chức năng pause() cho đến khi có tín hiệu đến. Đầu vào của người dùng không phải là tín hiệu. Một tín hiệu có thể được phát ra bởi một quá trình khác hoặc chính hệ thống. Ví dụ:

Nhấn Ctrl-C làm cho vỏ của bạn gửi tín hiệu SIGINT tới quy trình đang chạy, trong đó các trường hợp bình thường sẽ khiến quá trình bị giết.

Để mô phỏng hành vi của pause trong ISO C99, bạn có thể viết nội dung như sau. Mã được nhận xét, nếu bạn có câu hỏi về việc triển khai này, vui lòng hỏi.

#include <unistd.h> 
#include <stdio.h> 
#include <signal.h> 

/** 
* The type sig_atomic_t is used in C99 to guarantee 
* that a variable can be accessed/modified in an atomic way 
* in the case an interruption (reception of a signal for example) happens. 
*/ 
static volatile sig_atomic_t done_waiting = 0; 

static void  handler() 
{ 
    printf("Signal caught\n"); 
    done_waiting = 1; 
} 

void my_pause() 
{ 
    /** 
    * In ISO C, the signal system call is used 
    * to call a specific handler when a specified 
    * signal is received by the current process. 
    * In POSIX.1, it is encouraged to use the sigaction APIs. 
    **/ 
    signal(SIGINT, handler); 
    done_waiting = 0; 
    while (!done_waiting) 
    ; 
} 

int  main() 
{ 
    my_pause(); 
    printf("Hey ! The first call to my_pause returned !\n"); 
    my_pause(); 
    printf("The second call to my_pause returned !\n"); 
    return (0); 
} 

Lưu ý ví dụ này chỉ hoạt động với tín hiệu SIGINT. Để xử lý một bộ tín hiệu bổ sung, bạn có thể sử dụng các cuộc gọi khác đến signal() với các số tín hiệu khác nhau hoặc sử dụng sigaction() bằng mặt nạ tham chiếu tất cả các tín hiệu mong muốn.

Danh sách đầy đủ các tín hiệu có sẵn trên hệ thống của bạn có thể được tìm thấy trong bạn <signal.h> bao gồm.

+4

Bận chờ đợi là xấu. Đặt một giấc ngủ trong vòng lặp đó. – Dave

+1

(ngủ sẽ thức dậy sớm cho tín hiệu) – Dave

+1

Cảm ơn Halim Qarroum đây chính xác là những gì tôi cần. –

Các vấn đề liên quan