2010-12-14 24 views
5

Làm thế nào tôi có thể giết một quá trình nền đã được thực hiện bằng cách sử dụng một cuộc gọi chức năng hệ thống trong ngôn ngữ C. Ví dụ như tôi có một ứng dụng được biên dịch gọi là "fooprocess". Sau đó, tôi muốn viết một chương trình mà sẽ thực hiện việc áp dụng fooprocess trong nền sử dụng chức năng hệ thống, xin vui lòng xem dưới đây mã,Làm thế nào để loại bỏ quá trình nền từ cuộc gọi chức năng hệ thống

const char app[] = "fooprocess &"; 
system(app); 

Như bạn có thể thấy có một "&" nhân vật để tôi có thể chạy ứng dụng fooprocess trong nền. Làm thế nào tôi có thể giết fooprocess này?

Rất cám ơn.

+1

Có thể là 'hệ thống ("pkill fooprocess"); '? – jweyrich

+0

@jweyrich, cảm ơn bạn đã thử điều đó. – domlao

Trả lời

5

Để tương tác với quá trình bạn cần PID của nó. Tôi không chắc chắn nếu nó có thể với system nhưng một trong những thay thế là để ngã ba quá trình mình bằng cách sử dụng fork + exec.

+0

Cảm ơn, bạn có thể đưa ra một số mã cơ bản cho việc này không. – domlao

+1

Không thể thực hiện với 'hệ thống'. Nếu hệ thống của OP có 'posix_spawn', nó có thể dễ sử dụng hơn' fork' và 'exec'. –

0


Tôi đã thử vấn đề của bạn sử dụng này:

ps -axc|grep -i myApp|awk '{print $1}' | tr -d '\n' | xargs -0 kill 

bạn có thể đặt trong hệ thống() như sau:

system("ps -axc|grep -i myApp|awk '{print $1}' | tr -d '\n' | xargs -0 kill"); 

Điều đó sẽ làm việc.

+0

Khi tất cả những gì bạn có là một cái búa ... –

+0

@Adam Rosenfield: điều đó có nghĩa là gì? :-) –

+2

Điều tôi đang cố nói là 'hệ thống' là công cụ sai cho công việc. "Khi tất cả các bạn có là một cái búa, mọi thứ trông giống như một cái đinh." Giải pháp đúng là sử dụng 'fork' +' exec' thay vì 'system' để sinh ra quá trình con, và sau đó nó dễ dàng hơn nhiều để tương tác với quá trình đó. –

2

Bạn hoàn toàn không thể sử dụng system("foo &"); để tạo các quy trình nền mà sau này bạn có thể theo dõi/giết. Bất kỳ việc sử dụng nào cũng có lỗi khổng lồ khổng lồ: ngay cả khi bạn biết pid, không có cách nào để biết liệu quá trình với pid đó là quá trình bạn chạy ban đầu hay quá trình hoàn toàn khác đã xảy ra để nhận được cùng một pid sau .

Để giải quyết vấn đề này (và vô số các vấn đề khác mà bạn không muốn nghĩ đến hoặc nó sẽ làm bạn đau đầu), bạn nên quên rằng bạn đã từng học về hàm system và tạo các tiến trình con với forkexec hoặc posix_spawn. Điều này sẽ dẫn đến một quy trình con trực tiếp (phương pháp hiện tại của bạn là tạo ra những đứa trẻ mồ côi và được thực hiện bởi quy trình init) mà bạn có thể wait/waitpid vào, và cho đến khi bạn thực hiện thao tác wait, pid của quy trình con thuộc về bạn và không thể sử dụng lại, do đó, an toàn để gửi tín hiệu đến nó, v.v.