2013-03-01 28 views
12

Tôi đang chuyển hướng đầu ra của stderr và stdout của chương trình c của tôi để hai tập tin và sau đó khôi phục lại các thiết bị xuất chuẩn gốc và stderr:Chuyển stdout và stderr đến cùng một tập tin và khôi phục lại nó

int sout = dup(fileno(stdout)); 
freopen("test.txt","w",stdout); 

int serr = dup(fileno(stderr)); 
freopen("test.txt","a",stderr); 

//some output.... 

dup2(sout,fileno(stdout)); 
close(sout); 

dup2(serr,fileno(stderr)); 
close(serr); 

Đó là mã axample . Những công việc này.

Nhưng tôi muốn chuyển hướng stdout và stderr sang cùng một tệp (và sau đó khôi phục lại) để đầu ra được sắp xếp theo thứ tự như được sắp xếp trên đầu ra bàn điều khiển khi không chuyển hướng stderr và stdout. Làm thế nào tôi có thể làm điều đó?

Trân

sw

Trả lời

12

Thay vì mở lại tệp cho stderr, như trong:

freopen("test.txt","a",stderr); 

chuyển hướng nó vào stdout ở cấp bộ mô tả tập tin bằng cách thực hiện:

dup2(fileno(stdout), fileno(stderr)); 

Lưu ý rằng stdoutstderr sẽ vẫn sử dụng bộ đệm cấp người dùng độc lập và khi không được hướng dẫn tại một thiết bị đầu cuối tương tác, các quy tắc xả sẽ khác nhau. Điều này rất có thể sẽ là nguyên nhân chính cho thứ tự đầu ra khác nhau khi được chuyển hướng. Xem this explanation of flushing modes và trang hướng dẫn sử dụng cho setvbuf().

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