2011-06-30 35 views
6

Linux/C/ống:Ống Linux: Ghi lại đầu ra thời gian thực của ping qua popen

Làm cách nào tôi có thể nắm bắt đầu ra lệnh ping bằng popen (Hoặc các cuộc gọi hệ thống tương tự). Hiện tại popen sẽ đợi cho đến khi ping kết thúc. Sau đó, đầu ra sẽ được bán cùng nhau.

Pseudo code:

fp= popen("ping x.x.x.x", "r"); 
while(!feof(pFp)) 
{ 
    if(fgets(fp ...) // <==currently the code blocks here until ping finishes in popen 
    { 
     printf(...real time ping output here); 
    } 
} 
+0

C hoặc C++? Mã của bạn trông giống như C. – ThiefMaster

+0

Có thể bạn đang bị giật. Sử dụng ống (2) để kiểm soát nhiều hơn. – cdarke

+1

@cdarke: sẽ không giúp ích gì. Vấn đề là ping đang đệm đầu ra của nó. Tôi chắc chắn sẽ xem xét một lỗi trong ping. Nếu nó biết nó sẽ không có bất kỳ đầu ra nhiều hơn cho đến một giây (khi nó ngủ) sau đó nó nên tuôn ra đầu ra của nó trước khi ngủ ... –

Trả lời

7

Nó không chờ đợi cho đến khi ping xong. Thay vào đó, ping đang đợi cho đến khi vùng đệm stdout lấp đầy trước khi viết bất kỳ thứ gì. Cách duy nhất để tránh điều này liên quan đến tses giả. Hoặc bạn nên từ bỏ popen và viết mã để tự chạy quy trình ping và sử dụng lệnh giả để giao tiếp (điều này dễ dàng với chức năng forkpty không chuẩn nhưng rộng rãi) hoặc bạn có thể viết chương trình trình bao chạy ping qua pseudo -pty và lấy đầu ra, và viết nó mà không cần đệm đến stdout.

+0

Cảm ơn, tôi đã thử setvbuf (fp, NULL, _IONBF, 0)) quá. Tôi mong đợi kể từ khi bộ đệm bị tắt, đầu ra sẽ có sẵn ngay lập tức. Tôi không hiểu tại sao điều này không hoạt động. Có vẻ như tôi phải làm những gì bạn gợi ý. – Jacob

+3

Điều đó sẽ không giúp ích gì. Tất cả những gì làm là vô hiệu hóa đệm trên bộ đệm * đầu vào * của bạn. Nhưng bộ đệm có vấn đề nằm bên trong chương trình ping trong bộ đệm * đầu ra *. Bạn hoàn toàn không kiểm soát được điều đó. –

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