想在bash修改版**中得到執行使用者輸入命令後的回顯資料,沒調通。管道中沒有資料, 應該是找到的fd不對。
bash**執行使用者輸入的命令後,具體命令回顯用的是重定向。
重定向用linuxc實現時,用的是dup和dup2. 從頭做個試驗,體會一下dup和dup2的效果。
本來可以在sshd**中嘗試得到回顯,因為sshd服務端和ssh客戶端(xshell, putty)之間是有通訊的,將回顯內容傳送到ssh客戶端的實現找到即可截獲回顯. 可是fedora-powerpc版中編譯不過公版的sshd**,編譯時缺的元件, 找不到對應的powerpc版的rpm包。
通過試驗,明確了dup和dup2的效果。知道了如何儲存和恢復原始的stdin, stdout, stderr的fd.
開源**中,用到fd時,經常會直接寫死0,1,2. 這樣不規範,應該寫巨集 : stdin_fileno, stdout_fileno, stderr_fileno. 可能大神們覺得寫0,1,2方便吧。
// @file main.cpp
// @note on fedora22 view syslog use 'journalctl -f'
// 'tail -f /var/log/message' is invalid
#include #include #include #include #include #include #include #include #include // 日誌級別 - 除錯
#ifndef mylog_d
#define mylog_d(fmt, ...) \
do while (0);
#endif // #ifndef mylog_d
// info for crrent tty info
typedef struct _tag_who_info tag_who_info;
void init(const char* psz_log_owner_name);
void uninit();
void proc_sig_term(int num);
int fn_test();
int main(int argc, char** argv)
;#ifdef make_file_macro__bin_name
sprintf(sz_buf, "%s", make_file_macro__bin_name);
init(sz_buf);
mylog_d("make_file_macro__bin_name = [%s]", make_file_macro__bin_name);
#else
init(null);
#endif // #ifdef make_file_macro__bin_name
fn_test();
uninit();
mylog_d("the end");
return exit_success;
}void init(const char* psz_log_owner_name)
signal(sigterm, proc_sig_term);
}void uninit()
void proc_sig_term(int num)
int fn_test()
fd_stdout_org = dup(stdout_fileno);
if (fd_stdout_org < 0)
fd_stderr_org = dup(stderr_fileno);
if (fd_stderr_org < 0)
// if want view a file will be create later, can use 'tail -f obj_file_path_name'
msg = "1. write to stdout";
printf("%s\n", msg); // write to stdout
if (fd1 < 0)
fd2 = dup(fd1);
if (fd2 < 0)
fd3 = dup(fd1);
if (fd3 < 0)
msg = "2. write to /home/dev/test.txt\n";
write(fd1, msg, strlen(msg));
msg = "3. write to /home/dev/test.txt too\n";
write(fd2, msg, strlen(msg));
msg = "4. write to /home/dev/test.txt too\n";
write(fd3, msg, strlen(msg));
msg = "5. write to stdout\n";
printf("%s", msg);
close(stdout_fileno);
// change stdout to fd1("/home/dev/test.txt")
fd4 = dup2(fd1, stdout_fileno);
if (fd4 != stdout_fileno)
// from now, write to stdout is write to fd1("/home/dev/test.txt")
msg = "6. write to /home/dev/test.txt\n";
printf("%s", msg);
msg = "7. write to /home/dev/test.txt too\n";
write(fd1, msg, strlen(msg));
// change stdout to original stdout
fd5 = dup2(fd_stdout_org, stdout_fileno); // restore original stdout fd
if (fd5 != stdout_fileno)
// from now, write to stdout is real write stdout
msg = "8. write to stdout\n";
printf("%s", msg);
close(fd1);
msg = "9. after close fd1, write to fd1 do nothing\n";
write(fd1, msg, strlen(msg));
msg = "10. write to /home/dev/test.txt\n";
write(fd2, msg, strlen(msg));
msg = "10. write to /home/dev/test.txt too\n";
write(fd3, msg, strlen(msg));
msg = "10. write to stdout\n";
write(fd5, msg, strlen(msg));
} while (0);
if (fd1 >= 0)
if (fd2 >= 0)
if (fd3 >= 0)
if (fd4 >= 0)
if (fd5 >= 0)
if (fd_stdin_org >= 0)
if (fd_stdout_org >= 0)
if (fd_stderr_org >= 0)
return 0;
}
輸入輸出重定向 dup dup2
輸入重定向 將檔案匯入指定命令中 輸出重定向 將原本輸出開啟螢幕上資料資訊寫入到檔案當中 標準輸入重定向 stdin,檔案描述符為0 預設從鍵盤輸入,也可以從其他檔案或者命令中輸入 標準輸出重定向 stdout,檔案描述符為1 預設輸出到螢幕 標準輸出重定向符號 1 將標準輸出重定向到指定檔案中 清...
檔案描述符的重定向 dup dup2
dup dup2 進行檔案描述符的重定向即建立乙個oldfd的副本。dup 最低編號 未被使用的檔案描述符是oldfd的乙份拷貝。dup2 newfd是oldfd的乙份拷貝。返回值 成功 newfd 失敗 1 基於tcp的socket程式設計 以基於tcp的socket程式設計中的多執行緒伺服器為例...
使用dup dup2進行檔案描述符重定向
當乙個程序執行時,會有相應的檔案描述符 linux一切皆檔案 一般會有3個預設的檔案描述符 0 與標準輸入關聯 1 與標準輸出關聯 2 與標準錯誤輸出關聯 dup dup2函式,對檔案描述符重定向 close 1 關閉要重定向的檔案描述符 dup fd,1 將標準輸出重定向到開啟的檔案 dup2 f...