2009-03-12 31 views
6

Tôi đang sử dụng hàng đợi tin nhắn dưới dạng ipc giữa 2 chương trình. Bây giờ tôi muốn gửi dữ liệu từ chương trình này sang chương trình khác bằng hàng đợi tin nhắn và sau đó thân mật thông qua tín hiệu SIGINT.cách gửi tín hiệu từ một chương trình này sang chương trình khác?

Tôi không biết cách gửi tín hiệu từ một chương trình này sang chương trình khác. Ai cũng có thể cung cấp mã mẫu nếu họ có giải pháp.

Trả lời

5

Tín hiệu trong linux có thể được gửi bằng cách sử dụng lệnh gọi hệ thống giết chỉ cần kiểm tra này link để biết tài liệu về cách gọi hệ thống và ví dụ. bạn có thể thấy man -2 cũng giết. và nó không khuyến khích sử dụng SIGUSR1 sử dụng SIGINT hoặc SIGUSR2

+0

Tôi muốn thêm: không nên sử dụng chúng vì chúng là tín hiệu tiêu chuẩn. tốt hơn là sử dụng tín hiệu thời gian thực, bắt đầu từ SIGTRMIN. họ có một số lợi thế quan trọng. – Tebe

11
#include <sys/types.h> 
#include <signal.h> 
int kill(pid_t pid, int sig); 
+0

cách lấy pid của quá trình khác trong chương trình này. – Chaithra

+1

có một số cách để thực hiện việc này. Nếu một là cha mẹ của người kia, cha mẹ nhận được pid của đứa trẻ khi nó gọi fork(), và đứa trẻ có thể nhận được của cha mẹ với getppid(). Nếu đây không phải là trường hợp, bạn có thể đặt pid ở một vị trí đã đồng ý. Ví dụ, một tập tin mà một người viết cho người khác. –

+0

có. được. nhưng nếu nó là một số chương trình khác ..? sau đó làm thế nào để gửi processid đến chương trình đó .. chúng tôi có thể gửi bằng cách sử dụng một ổ cắm? – Chaithra

-4
system("kill -2 `pidof <app_name_here>` "); 
+1

Đây là cách * rất lộn xộn để gửi tín hiệu từ quy trình này sang tiến trình khác. Làm thế nào về việc sử dụng hệ thống kill() hoặc sigqueue() gọi? – slacy

1

Lưu ý rằng bằng cách sử dụng các sigqueue() gọi hệ thống, bạn có thể vượt qua một mảnh thêm dữ liệu cùng với tín hiệu của bạn. Dưới đây là một báo ngắn gọn từ "người đàn ông 2 sigqueue":

Đối số giá trị được sử dụng để xác định một mục kèm theo dữ liệu (hoặc một số nguyên hoặc một giá trị con trỏ) để được gửi với tín hiệu, và có các loại sau:

 union sigval { 
     int sival_int; 
     void *sival_ptr; 
    }; 

Đây là một cách rất thuận tiện để vượt qua một chút nhỏ của thông tin giữa 2 quá trình này. Tôi đồng ý với người sử dụng ở trên - sử dụng SIGUSR1 hoặc SIGUSR2 và một sigval tốt, và bạn có thể vượt qua bất cứ điều gì bạn muốn.

Bạn cũng có thể chuyển một con trỏ tới một đối tượng nào đó trong bộ nhớ dùng chung thông qua sival_ptr và truyền một đối tượng lớn hơn theo cách đó.

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