2011-11-10 40 views
5

Tôi đã tạo một chương trình vỏ phân tán có máy khách và máy chủ. Máy khách gửi yêu cầu lệnh tới máy chủ và máy chủ thực hiện lệnh đó cục bộ và được cho là xuất kết quả của lệnh đó tới máy khách. Tôi gặp khó khăn trong việc tìm cách chuyển hướng stdout/stderr cho khách hàng. Tôi sử dụng execvp để thực thi lệnh.Chuyển hướng stdout và stderr sang ổ cắm cho chương trình shell được phân phối

Tôi nghĩ tôi có thể phải sử dụng dup2? Nhưng tôi không thể tìm ra cách sử dụng nó đúng cách. Bất kỳ giúp đỡ?

Trả lời

7

Bạn chỉ cần sử dụng dup2() để sao chép bộ mô tả tệp của socket vào trình mô tả tệp stderr và stdout. Nó khá giống với việc chuyển hướng đến đường ống.

cpid = fork(); 
if (cpid == 0) { 
    dup2(sockfd, STDOUT_FILENO); 
    dup2(sockfd, STDERR_FILENO); 
    execvp(...); 
    /*... etc. etc. */ 
+0

Vì vậy, tôi đã thử phương pháp này nhưng không có đầu ra nào hiển thị ở phía máy khách. Nhưng thay cho sockfd, tôi chỉ đặt biến của socket của tôi. Tôi đoán đó không phải là mô tả tập tin thực tế của ổ cắm? Làm thế nào để thực sự tìm ra những gì mô tả tập tin của socket là? – y3di

+0

Bộ mô tả tập tin socket (trên máy chủ) là một bộ được trả về bởi 'accept()' - giống như bạn đã đọc/ghi vào/từ nếu bạn không sử dụng 'fork()'/'execvp() '. Nếu đó là một trong những bạn đang sử dụng, có thể có một vấn đề khác với mã của bạn. – Dmitri

+0

là có bất kỳ mã nào tôi nên làm phía khách hàng để cho đầu ra đi qua? Tôi có cần phải đọc() hay cái gì đó sắp xếp [như thể máy chủ đang viết gì đó cho cổng đó] – y3di

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