使用dup,dup2重定向的試驗

2021-08-20 19:56:05 字數 3695 閱讀 3160

想在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...