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]='