2012-01-27 35 views
8

thể trùng lặp:
Linux: Prevent a background process from being stopped after closing SSH clientLàm thế nào để sử dụng fork() để daemonize một tiến trình con độc lập với cha mẹ của nó?

tôi có một chương trình C mà tôi truy cập và tương tác với hơn terminal (thường từ SSH trên một hộp linux). Tôi đã cố gắng tìm ra giải pháp cho vấn đề mà sau khi đóng terminal/logout, quá trình kết thúc bằng nó (chương trình yêu cầu một số tùy chọn về kinh doanh của nó mà không cần tương tác thêm vì vậy tôi muốn có nó tiếp tục chạy ngay cả sau khi tôi đăng xuất SSH). Có nhiều cách trong linux để tránh điều này như 'màn hình', nhưng tôi muốn làm điều đó theo lập trình với C mà không dựa vào các gói đã cài đặt như màn hình, ngay cả khi điều này có nghĩa là phát minh lại bánh xe. Cho đến nay tôi hiểu fork() là cách tầm thường tiêu chuẩn để thực hiện một quy trình, vì vậy bất kỳ ai cũng có thể giúp tôi hoàn thành mã cho phép quá trình được mô tả ở trên xảy ra? Không.

Trong mẹ:

main() 
{ 

//Do interactive stuff 

signal(SIGCHLD, SIG_IGN); //stops the parent waiting for the child process to end 

if(fork()) 
exit(0); 
// and now the program continues in the child process 

tôi bây giờ có thể logout của SSH đó đóng vỏ gốc ... và đứa trẻ tiếp tục công việc của mình!

Trong con:

//Continue with processing data/whatever the program does (no input/output to terminal required) 
exit(0); 
+3

Đọc tất cả các câu trả lời. http://stackoverflow.com/questions/285015/linux-prevent-a-background-process-from-being-stopped-after-closing-ssh-client –

+0

Um, chỉ cần sử dụng 'nohup' khi bạn chạy nó? Không yêu cầu. –

+0

@ Brian, nohup sẽ không cho phép tôi tương tác với chương trình. Một tương tác dòng lệnh của nó. – user1166981

Trả lời

12

tách quá trình này từ cha mẹ:

sử dụng setsid() trên quá trình trẻ em, nó sẽ chạy chương trình trong phiên làm việc mới

sid = setsid(); 

hãy xem ví dụ trên http://www.itp.uzh.ch/~dpotter/howto/daemonize


Để Giữ một chương trình chạy ngay cả khi nhà ga được đóng:

SIGHUP là một tín hiệu được gửi đến một quá trình khi thiết bị đầu cuối kiểm soát của nó được đóng lại.

cố gắng bỏ qua nó bằng cách sử

signal (SIGHUP, SIG_IGN); 
+0

Có người khác đã đề xuất khởi chạy chương trình với nohup- nhưng bạn có thể đề xuất cách thực hiện chương trình này trong ngữ cảnh của mã tôi đã đăng không? – user1166981

+0

@Người dùng bạn có thể cài đặt trình xử lý tín hiệu cho tín hiệu này bỏ qua nó. chỉ cần chắc chắn đăng ký trình xử lý với quy trình mới, chứ không phải phụ huynh. http://www.gnu.org/software/libc/manual/html_node/Signal-Handling.html –

+0

Ok Tôi sẽ cố gắng, cảm ơn tất cả các bạn. – user1166981

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