Linux系统编程:简单文件IO操作(4)

if ( -1 == fd1 ) {
        perror( "open" );
        return -1;
    }else {
        printf("文件打开成功:fd=%d\n", fd1);
    }

//dup后的文件,同时write 是接着写入
    fd2 = dup( fd1 );
    printf("文件dup成功:fd=%d\n", fd2);

//分别向fd1和fd2指向的文件写入

char buf1[] = "ghost";
    char buf2[] = "wu";

int count1 = -1, count2 = -1;

while ( 1 ) {
        count1 = write( fd1, buf1, strlen( buf1 ) );
        if ( -1 == count1 ) {
            perror( "buf1->write" );
            return -1;
        }else {
            printf("buf1->文件写入成功\n");
        }

sleep( 1 );

count2 = write( fd2, buf2, strlen( buf2 ) );
        if ( -1 == count2 ) {
            perror( "buf2->write" );
            return -1;
        }else {
            printf("buf2->文件写入成功\n");
        }
    }

close( fd1 );
    close( fd2 );
    return 0;
}

在linux系统中,内核占用了0、1、2这三个fd,当我们运行一个程序得到一个进程时,内部就默认已经打开了3个文件,

对应的fd就是0、1、2。分别叫stdin、stdout、stderr。也就是标准输入、标准输出、标准错误。接下来,我们把标准输出关闭,printf就不会输出,如果用dup复制原来的fd,那么新dup出来的fd就是1(对应标准输出)

之后标准输出的内容都会被写入到原来fd对应的那个文件

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

int main(int argc, char const *argv[]) {

int fd = -1;

fd = open( "ghostwu2.txt", O_RDWR );
    if ( -1 == fd ) {
        perror( "open" );
        return -1;
    }else {
        printf( "文件打开成功fd=%d\n", fd );
    }

//fd=0 对应stdin  fd=1 对应 stdout  fd=2 对应stderror
    close( 1 ); //关闭fd=1的标准输出之后,printf输出看不见

int newFd = -1;

newFd = dup( fd ); //newFd一定是1, 因为分配后的fd从最小的没被占用的开始
    char buf[3];
    sprintf( buf, "%d", newFd ); //newFd转字符串型
    printf( "这是一段输出,由于newFd和fd关联到标准输出(newFd=1),会被写入到文件\n" );
    write( fd, buf, 1 );

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a4c0aac0c2f16e2aab3de9753a17a785.html