2008-08-13 27 views
8

Tôi có chương trình này, chúng tôi sẽ gọi nó là Máy chủ. Máy chủ lưu trữ tất cả các loại công cụ tốt, nhưng nó cần để có thể chấp nhận đầu vào thông qua dòng lệnh trong khi nó đang chạy. Điều này có nghĩa là nó phải bằng cách nào đó gửi dữ liệu quá trình khác của nó và sau đó bỏ thuốc lá. Ví dụ, tôi cần để có thể làm điều này:Gửi tin nhắn đến chương trình qua dòng lệnh

./Host --blahblah 3 6 3 5 

này bằng cách nào đó nên kết thúc kêu gọi một số chức năng trong máy chủ gọi

handleBlahBlah(int x1, int y1, int x2, int y2){ 
    //do some more sweet stuff 
} 

Host là một chương trình C, và không cần phải hỗ trợ nhiều trường hợp.

Ví dụ về điều này là trình phát nhạc Amarok. Với Amarok chạy và chơi, bạn có thể gõ "amarok --pause" và nó sẽ tạm dừng âm nhạc.

Tôi cần có khả năng thực hiện việc này trong Linux hoặc Windows. Tốt hơn là Linux.

Cách sạch nhất để thực hiện điều này là gì?

+0

Bạn có muốn chuyển đối số khi chương trình đang chạy không? Hệ điều hành này được lập trình để làm gì? –

Trả lời

-2

Vì vậy, tôi có thể bị thiếu điểm ở đây, nhưng bằng cách điếc một chức năng chính của chương trình C có hai đối số; argc, số đếm đối số (ít nhất một), và argv (hoặc arg vector), danh sách đối số. Bạn chỉ có thể phân tích cú pháp thông qua các đối số và gọi phương thức chính xác. Ví dụ:

int main(int argc, *argv[]) 
{ 
    /*loop through each argument and take action*/ 
     while (--argc > 0) 
     { 
      printf(%s%s, *++argv, (argc > 1) ? " " : ""); 
     } 
} 

sẽ in tất cả các đối số trên màn hình. Tôi không phải là guru, vì vậy tôi hy vọng tôi đã không phạm sai lầm nào.

EDIT: Ok, anh ấy đã theo dõi một số thứ khác, nhưng nó không thực sự rõ ràng trước khi câu hỏi được chỉnh sửa. Không phải nhảy vào đại diện của tôi ...

8

Nếu bạn đang sử dụng Windows, tôi sẽ yêu cầu bạn sử dụng cửa sổ ẩn để nhận tin nhắn, nhưng vì bạn đã sử dụng ./, tôi cho rằng bạn muốn một thứ gì đó Unix dựa trên.

Trong trường hợp đó, tôi muốn đi với số named pipe. Mặt trời có tutorial về các đường ống có tên có thể hữu ích.

Chương trình có thể sẽ tạo đường ống và nghe. Bạn có thể có một tập lệnh dòng lệnh riêng biệt để mở đường ống và chỉ cần lặp lại các đối số dòng lệnh của nó cho nó.

Bạn có thể sửa đổi chương trình của bạn để hỗ trợ gửi dòng lệnh thay vì sử dụng tập lệnh riêng biệt. Bạn sẽ làm điều tương tự trong trường hợp đó. Chương trình của bạn sẽ xem xét các đối số dòng lệnh của nó, và nếu có, hãy mở đường dẫn đến thể hiện "chính" của chương trình và gửi các đối số qua.

+1

+1 Tôi đã sử dụng phương pháp này có tên là ống nhiều lần và nó hoạt động khá tốt. Tôi cũng đã sử dụng các socket UNIX cho các trường hợp chương trình chính cần trả về dữ liệu cho kịch bản lệnh/chương trình dòng lệnh. – jschmier

5

Nếu nó cần phải là nền tảng chéo, bạn có thể muốn xem xét làm cho cá thể đang chạy lắng nghe trên cổng TCP và có cá thể bạn kích hoạt từ dòng lệnh gửi thư đến cổng đó.

4

Tôi khuyên bạn nên sử dụng số Unix socket hoặc D-Bus. Sử dụng ổ cắm có thể nhanh hơn nếu bạn quen với lập trình socket Unix và chỉ muốn một vài thao tác, trong khi đó D-Bus có thể giúp bạn tập trung vào thực hiện chức năng theo cách hướng đối tượng quen thuộc dễ dàng hơn.

Hãy xem Beej's Guide to Unix IPC, đặc biệt là chương trên Unix sockets.

1

Điều mà không ai nói ở đây là: "bạn không thể đến đó từ đây".

Dòng lệnh chỉ khả dụng khi chương trình của bạn được gọi.

Các ví dụ về cách gọi "fillinthename luận ..." để giao tiếp với fillinthename lần fillinthename đang chạy chỉ có thể được thực hiện bằng cách sử dụng hai trường hợp của chương trình mà giao tiếp với nhau.

Các câu trả lời khác đề xuất các cách để đạt được liên lạc.

Một Amarok như chương trình cần để phát hiện sự tồn tại của một ví dụ của bản thân để biết được vai trò của nó phải đóng, vai trò chính của dai dẳng nhắn nhận/máy chủ, hoặc vai trò nhỏ của một bắn người gửi tin nhắn.

được chỉnh sửa để làm cho từ fillinthename thực sự được hiển thị.

0

Một kỹ thuật tôi đã thấy là có chương trình Host của bạn chỉ đơn thuần là một "trình bao" cho chương trình thực sự của bạn. Ví dụ: khi bạn khởi chạy ứng dụng của mình bình thường (ví dụ: ./Host), chương trình sẽ ngã ba vào phần "ứng dụng chính" của mã của bạn. Khi bạn khởi chạy chương trình theo cách gợi ý bạn muốn báo hiệu trường hợp đang chạy (ví dụ: ./Host --send-message restart), chương trình sẽ ngã ba vào phần "người gửi thư" trong mã của bạn. Nó giống như có hai ứng dụng trong một. Một tùy chọn khác không sử dụng fork là đặt Host hoàn toàn là ứng dụng "người gửi thư" và có "ứng dụng chính" của bạn dưới dạng tệp thực thi riêng biệt (ví dụ: Host_core) mà Host có thể khởi chạy riêng.

Phần "ứng dụng chính" của chương trình sẽ cần mở một số kênh liên lạc để nhận tin nhắn và phần "người gửi tin nhắn" sẽ cần kết nối với kênh đó và sử dụng nó để gửi tin nhắn. Có một số tùy chọn khác nhau có sẵn để gửi tin nhắn giữa các quá trình. Một số phương pháp phổ biến hơn là pipessockets. Tùy thuộc vào hệ điều hành của bạn, bạn có thể có các tùy chọn bổ sung; ví dụ, QNX có channels và BeOS/Haiku có BMessages. Bạn cũng có thể tìm thấy một thư viện kết thúc gọn gàng chức năng này, chẳng hạn như lcm.