linux c-关于使用 dup2 函数重定向的一些疑问,望高手解惑~~!!

问题描述

关于使用 dup2 函数重定向的一些疑问,望高手解惑~~!!

先上一段正常的代码,如下:

 #include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(){
    int oldfd = open("mytest",O_RDWR | O_CREAT,0644);

    dup2(oldfd,1);
  close(oldfd); 

  printf("hello worldn");
  return 0;

}

编译,运行,结果正常, hello world 被重定向到了文件。
接着 给代码 加上一个 死循环,让 hello world 不断的写入重定向的文件。代码如下:

 #include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(){
    int oldfd = open("mytest",O_RDWR | O_CREAT,0644);

    dup2(oldfd,1);
  close(oldfd); 

  while(1)
    printf("hello worldn");
  return 0;

}

编译,运行,然后查看 mytest 文件,发现 hello world 在不断的写入,也是正常的。然后,加上一个 sleep 出现问题了。(先删除 mytest 文件,然后修改代码)。代码如下:

 #include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(){
    int oldfd = open("mytest",O_RDWR | O_CREAT,0644);

    dup2(oldfd,1);
  close(oldfd); 

  while(1){
    sleep(1);
    printf("hello worldn");
  }
  return 0;

}

这个时候再编译运行,然后使用 cat 查看 mytest 文件,发现没有内容。 ls -l 查看 发现文件大小为0

解决方案

我自己找到答案了,修改后的代码如下:

``#include
#include
#include
#include
#include

int main(){
int oldfd = open("/home/gino/code/mytest",O_RDWR | O_CREAT,0644);

if(dup2(oldfd,1) == -1)
    printf("dup2 errn");

close(oldfd);
while(1){
sleep(1);
printf("hello world!n");

fflush(stdout);
}
return 0;
}`


原因是 stdout 在 中的数据并不会立刻输出,而是要等待进程要关闭的时候在输出,那么加上 fflush 函数 清除读写缓冲区即可。
时间: 2024-10-28 08:46:34

linux c-关于使用 dup2 函数重定向的一些疑问,望高手解惑~~!!的相关文章

简要对比C语言中的dup()函数和dup2()函数_C 语言

C语言dup()函数:复制文件描述词头文件: #include <unistd.h> 定义函数: int dup (int oldfd); 函数说明:dup()用来复制参数oldfd 所指的文件描述词, 并将它返回. 此新的文件描述词和参数oldfd 指的是同一个文件, 共享所有的锁定.读写位置和各项权限或旗标. 例如, 当利用lseek()对某个文件描述词作用时, 另一个文件描述词的读写位置也会随着改变. 不过, 文件描述词之间并不共享close-on-exec 旗标. 返回值:当复制成功时

APUE习题[实现dup2函数功能,不使用fcntl]

学习,记录. int dup2(int oldhandle, int newhandle); 函数功能: 复制文件句柄,newhandle指定的dup2和dup的区别就是可以用newfd参数指定新描述符的数值,如果newfd已经打开,则先将其关闭.如果newfd等于oldfd,则dup2返回newfd, 而不关闭它.dup2函数返回的新文件描述符同样与参数oldfd共享同一文件表项. 关键部分实现思路: 先close关闭需要复制到的文件描述符newdup. 连续dup,每dup一次产生的新的fd

《UNIXLinux程序设计教程》一3.4 dup()和dup2()函数

3.4 dup()和dup2()函数 用同一个open()打开的文件可以有多个描述字与它相连,这种描述字称为重复描述字.重复一个描述字有两种方法:用函数dup()或dup2(),或用函数fcntl()(3.6.1节). #include <unistd.h> int dup (int old); int dup2 (int old,int new); dup()复制描述字old至一个新描述字,新描述字保证是当前未打开的最小编号可用描述字.dup2()复制描述字old至编号为new的描述字.如果

dup,dup2函数【转】

转自:http://eriol.iteye.com/blog/1180624 转自:http://www.cnblogs.com/jht/archive/2006/04/04/366086.html   dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符.它们经常用来重定向进程的stdin.stdout和stderr.这两个函数的原形如下:   C代码   #include <unistd.h>   int dup( int oldfd );   int dup2(

dup和dup2函数

下面两个函数都可用来复制一个现存的文件描述符: #include<unistd.h> int dup(int filedes); int dup2(int filedes,int filedes2); 两函数的返回值:若成功则返回新的文件描述符,若出错则返回-1 由dup返回的新文件描述符一定是当前可用文件描述符中的最小值.用dup2则可以用filedes2参数指定新描述符的数值.如果filedes2已经打开,则现将其关闭.如若filedes等于filedes2,则dup2返回filedes2

Linux如何查看so中函数名

  Linux如何查看so中函数名 很多非常熟悉windows 进程依赖那个dll, 使用depends,linux使用ldd命令. 查看函数windows使用dumpbin,linux使用 objdump -tT libCavium4J.so |grep generateKey nm -D libCavium4J.so |grep generateKey

linux下串口编程read函数返回(非超时返回)问题

问题描述 linux下串口编程read函数返回(非超时返回)问题 串口编程经典应用场景:打开串口,阻塞模式,非超时返回,有数据返回,无数据死等. 简易代码为例: void* read_thread(void* param) { char szbuf[128]; int size = 0; while (running) { size = read(fd, szbuf, sizeof(szbuf)); } return 0; } int main() { fd = open(port, O_RDW

linux下简单的pthread_create函数,怎么我以-lpthread编译,怎么不行呢?

问题描述 linux下简单的pthread_create函数,怎么我以-lpthread编译,怎么不行呢? linux下简单的pthread_create函数,怎么我以-lpthread编译,怎么不行呢? 解决方案 http://blog.chinaunix.net/uid-25958655-id-2380122.html 解决方案二: linux函数之pthread_createLinux多线程函数pthread_create()函数linux编程之pthread_create函数 解决方案三

(高分求救)Linux内核在执行filp_open()函数的时候崩溃

问题描述 (高分求救)Linux内核在执行filp_open()函数的时候崩溃 在开发板上测试的时候,通过串口打印出来的信息发现,内核一直停在了filp_open()函数这,之后的代码都不能执行,filp_open()函数的参数没有问题,急求各路大神解救!!!!! 解决方案 我写的是filp_open("/mnt/sdcard/file.txt", O_RDWR|O_CREAT,0644):