2009-10-06 42 views
6

Với chương trình này hack.c:bash trap của TERM - tôi đang làm gì sai?

#include <stdio.h> 
main() 
{ 
int i=0; 
for(i=0; i<100; i++) { 
    printf("%d\n", i); 
    sleep(5); 
} 
} 

và kịch bản này bash hack.sh:

#!/bin/bash 
./hack 

Nếu tôi chạy hack.sh, hai quá trình được tạo ra - một cho bash, một cho C nhiệm vụ. Nếu tín hiệu TERM được gửi đến quá trình bash, quá trình C sẽ không bị hấn gì.

Bây giờ, giả sử bash gốc đã được khởi chạy từ một chương trình Java sử dụng Runtime.exec(), vì vậy điều khiển duy nhất tôi có trên đó là Process.destroy() (gửi TERM tới quy trình bash)? Giả sử tôi muốn quy trình C chết cùng với bash đã khởi chạy nó?

Tôi đã cố gắng mọi thứ như thế này trong bash:

#!/bin/bash 
trap "kill -TERM -$$; exit" TERM 
./hack 

tức là một khoản bẫy mà bắt tín hiệu TERM và phát lại nó vào nhóm toàn bộ quá trình. Điều này không hiệu quả đối với tôi - quy trình bash với mệnh đề bẫy đó trong đó bỏ qua tín hiệu TERM.

Tôi thiếu gì ở đây?

+1

Trang người đàn ông của bash nói: Nếu bash đang chờ lệnh hoàn thành và nhận được tín hiệu mà bẫy đã được đặt, bẫy sẽ không được thực hiện cho đến khi lệnh hoàn tất. – tangens

+0

Bạn đã thử sử dụng 'exec' thay vì giữ lại quá trình shell chưa? –

+0

Bạn đúng, tangens. Lý do duy nhất của tôi là văn bản nằm trong phần SIGNALS, phía trên tài liệu bẫy. Cảm ơn! –

Trả lời

10

Bạn có thể thử một cái gì đó dọc theo những dòng:

#!/bin/bash 
./hack & 
pid=$! 
trap "kill $pid" TERM 
wait $pid 

Nó có thể là đơn giản hơn (và tương đương) để làm điều này:

#!/bin/bash 
./hack & 
trap "kill $!" TERM 
wait 

Các dấu nháy kép vào bẫy nên mở rộng từ xảy ra khi bẫy được xác định, vì vậy giá trị thay đổi là $! không nên có tác động; nhưng tôi thích phiên bản đầu tiên tốt hơn.

+0

Điều này làm việc, mặc dù bạn có thể nghĩ rằng nó không phải vì những gì tangens nói trong các ý kiến ​​về câu hỏi. NHƯNG đoạn hoàn chỉnh, một phần do tangens đề xuất, nói: – hopla

+0

Nếu bash đang chờ lệnh hoàn thành và nhận tín hiệu cho bẫy đã được đặt, bẫy sẽ không được thực hiện cho đến khi lệnh hoàn tất. Khi bash đang chờ lệnh không đồng bộ thông qua nội bộ chờ đợi, việc tiếp nhận tín hiệu mà bẫy đã được đặt sẽ khiến nội dung chờ đợi trả về ngay lập tức với trạng thái thoát lớn hơn 128, ngay sau khi bẫy được thực hiện. – hopla

+0

Cũng muốn thêm rằng bạn có thể giết toàn bộ nhóm quá trình (quá trình tự nó và đó là trẻ em) bằng cách thực hiện: kill -TERM - $$ – hopla

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