linuxdup2
❶ linux文件重定向問題
應該是緩沖區造成的。printf是帶緩沖的。
就算25行輸出一個\n,也能寫到文件中。
但是如果25行什麼都不做,那麼就寫不到文件中。
反正我也覺得很有點奇怪,按理說你重定向之後,標准輸出應該指向文件的,可是並沒有。
至於這個問題,我也沒有弄得特別明白,不過我建議你在寫文件的時候,不要使用帶緩沖的,最好使用write和read來寫文件,這些都是不帶緩沖的。
❷ linux下重定向前後printf的輸出緩存機制怎麼變化
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
fflush(stdout);
setvbuf(stdout,NULL,_IONBF,0);
printf("test stdout\n");
int save_fd = p(STDOUT_FILENO); // 保存標准輸出 文件描述符 注:這里一定要用 p 復制一個文件描述符. 不要用 = 就像是Winodws下的句柄.
int fd = open("test1.txt",(O_RDWR | O_CREAT), 0644);
p2(fd,STDOUT_FILENO); // 用我們新打開的文件描述符替換掉 標准輸出
printf("test file\n");
//再恢復回來標准輸出. 兩種方式
//方法1 有保存 標准輸出的情況
//p2(save_fd,STDOUT_FILENO);
//方法2 沒有保存 標准輸出的情況
int ttyfd = open("/dev/tty",(O_RDWR), 0644);
p2(ttyfd,STDOUT_FILENO);
printf("test tty\n");
}
❸ linux 守護進程 標准輸出 標准錯誤輸出 重定向到文件中
啟動程序的時候直接重定向,./xxx >>/a/a/a/a &
❹ 在linux下編c,p2(fd, 1) 或 p2(fd, 0)中0和1是什麼意思
硬碟的意思,0 是NO.1 1是第二塊
❺ linux重定向的進階IO
>&n 使用系統調用 p2復制文件描述符 n 並把結果用作標准輸出;
<&n 標准輸入復制自文件描述符 n;
<&- 關閉標准輸入(鍵盤);
>&- 關閉標准輸出;
n<&- 表示將 n 號輸入關閉;
n>&- 表示將 n 號輸出關閉;
上述所有形式都可以前導一個數字,此時建立的文件描述符由這個數字指定而不是預設的 0 或 1。如:
... 2>file 運行一個命令並把錯誤輸出(文件描述符 2)定向到 file。
... 2>&1 運行一個命令並把它的標准輸出和輸出合並。(嚴格的說是通過復制文件描述符 1 來建立文件描述符 2 ,但效果通常是合並了兩個流。)
我 們對 2>&1詳細說明一下 :2>&1 也就是 FD2=FD1 ,這里並不是說FD2 的值 等於FD1的值,因為 > 是改變送出的數據通道,也就是說把 FD2 的 「數據輸出通道」 改為 FD1 的 「數據輸出通道」。如果僅僅這樣,這個改變好像沒有什麼作用,因為 FD2 的默認輸出和 FD1的默認輸出本來都是 monitor,一樣的! 但是,當 FD1 是其他文件,甚至是其他 FD 時,這個就具有特殊的用途了。請大家務必理解這一點。
exec 1>outfilename # 打開文件outfilename作為stdout。
exec 2>errfilename # 打開文件 errfilename作為 stderr。
exec 0<&- # 關閉 FD0。
exec 1>&- # 關閉 FD1。
exec 5>&- # 關閉 FD5。
❻ linux的p是復制文件描述字還是代替
其實就是這樣:
p()或者p2()主要是將某個特定的文件描述字輸出輸出的重定向!
他們保證將復制的文件描述字到當前未打開的最小描述字!事例代碼int fd;if(argc!=2){err_quit("Usage :filename");}if((fd=creat(argv[1],0644))
❼ LINUX中此程序運行後,為何刷新不出命令提示符
很遺憾,在我的centos6測試系統中,輸入你的程序編譯運行後,會直接顯示命令行提示符,不需要回車一下。
我認為這種情況是由於shell處理子進程的方式不同而引起的,研究這種原因大部分時間不如研究茴香豆的茴字有幾種寫法有意義。
如過你想找到原因,我認為可以在你的環境裡面,逐步的刪除你程序中一些不影響結果的行,然後調整運行方式(比如說,不要用close,不要wait等)再試試看吧
❽ linux 下 pipe()與p2 問題
#include<stdio.h>
#include<unistd.h>
intmain()
{
intfd[2];
pipe(fd);
if(fork()==0){
close(fd[0]);
p2(fd[1],STDOUT_FILENO);
close(fd[1]);
printf("Hello");
printf("123");
printf("ooppqq");
}else{
close(fd[1]);
#defineBUFFER_SIZE1024
charbuffer[BUFFER_SIZE];
intreadCount;
while((readCount=read(fd[0],buffer,
BUFFER_SIZE-1))>0){
buffer[readCount]='