Làm cách nào để ngăn chặn một quy trình con bỏ đói người khác?


10

Để rõ ràng, tôi không nói về bất cứ điều gì cần phải có emacs để được đa luồng (mặc dù điều đó có lẽ cũng sẽ giải quyết điều này). Để sao chép:

  1. emacs -Q # Tôi đang chạy 24.4.1
  2. Tạo khung thứ hai
  3. Chuyển về khung đầu tiên
  4. Vỏ Mx
  5. Mx đổi tên-duy nhất (chúng ta sẽ tạo vỏ thứ hai sau)
  6. Bắt đầu chạy: while true; do echo "hello world"; done
  7. Trong khung thứ hai, vỏ Mx

Shell thứ hai sẽ gần như không bao giờ hiển thị (hiếm khi nó hoạt động sau nhiều lần thử). Rõ ràng emacs sẽ không bao giờ nghỉ đọc đầu ra của vỏ đầu tiên để lắng nghe đầu ra đến từ bất kỳ quá trình nào khác. Nó sẽ là hành vi tốt hơn nhiều để nó làm tròn số vòng khi có nhiều quy trình với đầu ra đang chờ xử lý. Có cách nào để có được hành vi tốt hơn?

Bí quyết duy nhất tôi biết là làm cho bộ đệm tiến trình của riêng nó, nhưng thật không may, nó không hoạt động với tôi. Ngay cả khi tôi làm điều đó, tôi phải chạy một quy trình con để nghe một ổ cắm cho phần mềm nhận dạng giọng nói của tôi hoạt động để tôi thực sự có thể điều khiển vỏ ở vị trí đầu tiên, đó là cách tôi phát hiện ra điều này; chạy một vòng lặp vô hạn như ở trên sẽ ngăn chặn mọi dữ liệu khỏi ổ cắm.


1
Tôi không có câu trả lời cụ thể cho câu hỏi của bạn. Tuy nhiên, tôi muốn sử dụng start-processvới một set-process-filtervà một set-process-sentinel- điều này cho phép tôi đi trên đường vui vẻ của tôi làm công cụ khác trong khi quá trình chạy - Tôi thậm chí gửi đầu ra của tôi đôi khi đến *Messages*đệm sử dụng insertđể vùng phản hồi của tôi là không bị ảnh hưởng, hoặc tôi sử dụng một bộ đệm đầu ra quy trình chuyên dụng (nếu cần). Ví dụ, tôi có thể chạy một rsyncphiên dài . Tôi không có bất kỳ kinh nghiệm nào khi cố gắng chạy nhiều đồng thời / dài start-process, vì vậy tôi không chắc Emacs sẽ xử lý hàng loạt chúng như thế nào.
luật

2
Hmm thú vị tìm thấy. Cả hai lớp vỏ đều là các tiến trình riêng biệt và rõ ràng Emacs vẫn đang xử lý vòng lệnh chính của nó mà không gặp vấn đề gì. Tuy nhiên tôi nghi ngờ khi nó thăm dò các FD kém hơn, nó luôn tìm thấy thứ gì đó trên vỏ thứ nhất và không bao giờ được xử lý FD thứ hai. Nếu bạn giết trong khi [1] trong lớp vỏ thứ nhất thì lớp vỏ thứ hai thực sự xuất hiện như bạn mong đợi. Đây có lẽ là một câu hỏi cho danh sách gửi thư dev.
stsquad

Tôi có một vấn đề khác nhưng đó là smiliair với các khung: list.gnu.org/archive/html/orms-gnu-emacs/2015-10/msg01084.html
ReneFroger 10/11/2015

Câu trả lời:


2

Vì vậy, đây không phải là một giải pháp thích hợp nhưng tôi đã chạy thử nghiệm của bạn theo cách khác (ví dụ: trong khi [1] trên vỏ thứ hai) và nó hoạt động tốt. Vì công việc xung quanh bạn có thể đảm bảo rằng bất kỳ bộ đệm shell nào có khả năng tạo ra đầu ra nặng đều được tạo muộn hơn so với những bộ đệm mà bạn muốn tương tác. Bằng cách đó, các vỏ tương tác là lần đầu tiên được xử lý bởi cuộc thăm dò kém hơn của Emacs trước khi cuối cùng xử lý lớp vỏ tạo ra nhiều đầu ra.

Trong thực tế nếu bạn đang chạy một lựa chọn shell tương tác, bạn có thể sẽ không ở trong tình huống mà một người sử dụng I / O quá lâu. Nếu bạn thường xuyên cần một thứ như vậy có thể chuyển hướng đầu ra thành một tập tin và sử dụng chế độ xem là một giải pháp tốt hơn?


1
Vấn đề ở đây là không khó để viết một vòng lặp vô hạn một cách tình cờ. Tôi cũng không muốn phải suy nghĩ về kế hoạch tôi / OI sẽ làm bao nhiêu khi chạy các lệnh. Toàn bộ lợi thế của việc sử dụng emacs là mọi thứ đã có trong một bộ đệm có thể lưu tốt đẹp :)
Joseph Garvin

1
@JosephGarvin Tôi đánh giá cao điều đó. Tôi nghĩ rằng giải pháp tốt nhất nếu báo cáo Mx với trình sao chép tuyệt vời của bạn.
stsquad
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.