2011-09-25 9 views
7

Tôi đã thực hiện một chương trình bằng cách sử dụng fork()exec*(). Vấn đề là tôi không thể xác định thành công hay thất bại của exec() từ quá trình cha mẹ vì nó trên quá trình con riêng biệt. Tôi nghĩ rằng loại tín hiệu có thể được sử dụng để kiểm tra trạng thái này, nhưng tôi không có ý tưởng về điều này.Cách tiếp cận tiêu chuẩn để xác định thành công hay thất bại của ngã ba/exec (trong khi cha mẹ đang chạy đồng thời)?

  1. Cách được đề xuất/tiêu chuẩn/được sử dụng rộng rãi để kiểm tra điều này là gì?
  2. Và những cạm bẫy mà tôi phải quan tâm khi thực hiện việc này là gì?

Câu hỏi chi tiết Cập nhật (Xin lỗi vì thiếu sót chi tiết quan trọng)

tôi muốn giữ cả hai quá trình đang chạy vì vậy tôi không thể chỉ chờ xuất cảnh của tiến trình con. Nói cách khác, tôi muốn được thông báo về quy trình con 'exec thành công hay thất bại'.

+0

Bạn biết rằng bạn có thể truy vấn trạng thái con mà không chặn bằng cách sử dụng tùy chọn 'waitpid' và 'WNOHANG'? Tùy thuộc vào hệ thống của bạn, bạn cũng có thể có 'wait3' và' wait4' cũng hiểu cờ này. Hay bạn muốn báo hiệu điều gì đó cho phụ huynh trong khi vẫn giữ cho đứa trẻ đang chạy (như với các ẩn dụ IPC)? – DarkDust

+0

@DarkDust Tôi muốn giữ cho cả hai quy trình đang chạy và tôi muốn được thông báo về trạng thái con ''exec'. (thành công hay thất bại) Oh bạn đã xóa câu hỏi của tôi. Cảm ơn :) – Eonil

+1

có thể trùng lặp của [Điều gì có thể khiến exec thất bại? Điều gì sẽ xảy ra tiếp theo?] (Http://stackoverflow.com/questions/3703013/what-can-cause-exec-to-fail-what-happens-next) (Đặc biệt, xem [câu trả lời từ "R."] (http://stackoverflow.com/questions/3703013/#3703179)) – Nemo

Trả lời

7

Quy trình cha mẹ của bạn có thể sử dụng pid của quá trình con để phát hiện thấy nó đang hoạt động hoặc đã thoát (và có thể làm sai lệch mã lỗi và lỗi do tín hiệu chết, xem waitpid). Bạn có thể sử dụng mã lỗi hoặc tín hiệu nhất định để thông báo cho cha mẹ về các trường hợp lỗi cụ thể (ví dụ, trong đứa trẻ được chia đôi trước exec), nhưng đối với một đứa trẻ hoàn toàn chung, bạn không thể đặt trước bất kỳ mã hoặc tín hiệu thoát nào (vì cha mẹ sẽ không thể nói nếu exec đã thành công và sau đó đứa trẻ đã thoát với các giá trị đó).

Một cách tiếp cận khác thường được sử dụng là tạo một cặp ống fd (xem 'ống' syscall), và truyền một đầu cho con (thường là đầu ghi) và cái kia cho cha mẹ. Đứa trẻ có thể sử dụng điều này để gửi mã lỗi cụ thể cho phụ huynh. Và cha mẹ có thể phát hiện sớm chấm dứt nếu đường ống được đóng lại mà không nhận được bất kỳ dữ liệu nào. Có một số cạm bẫy: SIGPIPE sẽ được gửi đến cha mẹ nếu nó đọc trên một đường ống không có các nhà văn đang hoạt động, và sử dụng một fd (khác với stdin/stdout/stderr) trong một tiến trình con có thể gây nhầm lẫn mặc dù close-on-exec có thể giúp sửa lỗi đó).

Nói chung, tất cả các mã tôi đã thấy để làm cho fork + exec mạnh mẽ là khá hacky.