日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dup和dup2以及cat函数函数

發布時間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dup和dup2以及cat函数函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今日命令:

more filenamen //分屏顯示filename 內容 od -c filename //使用二進制形式查看文件內容

dup和dup2也是兩個非常有用的調用,它們的作用都是用來復制一個文件的描述符。它們經常用來重定向進程的stdin、stdout和stderr。這兩個函數的原形如下:

#include <unistd.h> int dup( int oldfd ); int dup2( int oldfd, int targetfd );

利用函數dup,我們可以復制一個描述符。傳給該函數一個既有的描述符,它就會返回一個新的描述符,這個新的描述符是傳給它的描述符的拷貝。這意味著,這兩個描述符共享同一個數據結構。例如,如果我們對一個文件描述符執行lseek操作,得到的第一個文件的位置和第二個是一樣的。下面是用來說明dup函數使用方法的代碼片段:

int fd1, fd2; ... fd2 = dup( fd1 );

dup2函數跟dup函數相似,但dup2函數允許調用者規定一個有效描述符和目標描述符的id。在使用dup2的時候若第二個參數的描述符targetfd已經打開則現將其關閉, dup2函數成功返回時,目標描述符(dup2函數的第二個參數)將變成源描述符(dup2函數的第一個參數)的復制品,換句話說,兩個文件描述符現在都指向同一個文件,并且是函數第一個參數指向的文件。下面我們用一段代碼加以說明:

int oldfd;oldfd = open("app_log", (O_RDWR | O_CREATE), 0644 );dup2( oldfd, 1 );close( oldfd ); #include <stdio.h> #include <stdlib.h> #include <unistd.h>int main() {int pfds[2];if ( pipe(pfds) == 0 ) {if ( fork() == 0 ) {close(1);dup2( pfds[1], 1 );close( pfds[0] );execlp( "ls", "ls", "-l", NULL );} else {close(0);dup2( pfds[0], 0 );close( pfds[1] );execlp( "wc", "wc", "-l", NULL );}return 0; }

//復制文件描述符并向文件寫數據

#include <unistd.h> #include <fcntl.h> #include <stdlib.h> #include <stdio.h> #include <string.h>void main() {int fd,newfd;char *bufFD="Advanced Programming! write by fd\n";char *bufNewFD="Advanced Programming! write by NewFD\n";fd = open("test.txt",O_RDWR|O_CREAT,0644);if(fd==-1){printf("open file error%m\n");exit(-1);}//開始復制了newfd = dup(fd);//使用fd寫write(fd,bufFD,strlen(bufFD));close(fd);//使用newfd寫write(newfd,bufNewFD,strlen(bufNewFD));if(close(newfd)==-1){printf("close error\n");}exit(0); }

實現簡單cat命令:實現的是無論輸入多少參數都能將其轉化為標準輸出輸出出來。

#include "io.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h>int main(int argc, char * argv[]) {int fd_in = STDIN_FILENO;int fd_out = STDOUT_FILENO;int i;for(i = 1; i < argc; i ++){ //寫上fro循環是為了無論輸入幾個命令行參數,都能夠將其轉換為標準輸出輸出出來fd_in = open(argv[i],O_RDONLY);if(fd_in < 0){perror("open error");continue;}copy(fd_in,fd_out);close(fd_in);}if(argc == 1){ copy(fd_in,fd_out);}return 0; }

io.c文件

#include "io.h" #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include <stdio.h>#define BUFFER_LEN 1024void copy(int fdin, int fdout) {char buffer[BUFFER_LEN];ssize_t size;while(( size = read(fdin, buffer, BUFFER_LEN )) > 0){ printf("current %ld\n",lseek(fdin,0L,SEEK_CUR));if( write( fdout, buffer, size) != size){fprintf(stderr,"write error: %s\n",strerror(errno));exit(1);}}if(size < 0){fprintf(stderr, "read error: %s\n",strerror(errno));exit(1);}}

io.h頭文件

#ifndef __IO_H #define __IO_Hextern void copy(int fdin, int fdout);#endif

使用dup函數,打造升級版cat命令:

#include "io.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h>/* *bin/mcat + iotec.txt (+為輸入重定向) *bin/mcat - iotec.txt(-為輸出重定向) */int main(int argc, char * argv[]) {int fd_in = STDIN_FILENO;int fd_out = STDOUT_FILENO;int flag = 0;int i;for(i = 1; i < argc; i ++){ //寫上fro循環是為了無論輸入幾個命令行參數,都能夠將其轉換為標準輸出輸出出來if(!strcmp("+", argv[i])){fd_in = open(argv[++i],O_RDONLY);if(fd_in < 0){perror("open error");}//將標準輸入重定向到文件if(dup2(fd_in, STDIN_FILENO) != STDIN_FILENO){perror("dup2 error!");exit(1);}close(fd_in);}else if(!strcmp("-",argv[i])){fd_out = open(argv[++i], O_WRONLY | O_CREAT | O_TRUNC, 0777);if(fd_out < 0){perror("open fd_out error!");exit(1); }//將標準輸出重定向到文件if(dup2(fd_out, STDOUT_FILENO) != STDOUT_FILENO){perror("dup2 error");exit(1);}}else {flag = 1;;fd_in = open(argv[i], O_RDONLY);if(fd_in < 0){perror("open error!");exit(1);}if(dup2(fd_in ,STDIN_FILENO) != STDIN_FILENO){perror("dup2 error");exit(1);}copy(STDIN_FILENO,STDOUT_FILENO);close(fd_in);}}if(!flag){copy(STDIN_FILENO, STDOUT_FILENO);}return 0; }

總結

以上是生活随笔為你收集整理的dup和dup2以及cat函数函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。