APUE習題3.2以及shell中重新導向符號的使用

來源:互聯網
上載者:User

標籤:

習題3.2的要求是不使用fcntl()而編寫一個同dup2()功能相同的函數。直覺上是不斷使用dup()直到返回指定的檔案描述符。
#include <stdio.h>
#include <stdlib.h>
#define OPEN_MAX 63

int my_dup2(int filedes,int filedes2);

int
main(int argc, char* argv[])
{
  int fd,fd2;
  char buf[] = "It work!\n";

  if(argc != 3)
    err_quit("Usage: %s <filedes#> <filedes2#>",argv[0]);
 
  fd = atoi(argv[1]);
  fd2 = atoi(argv[2]);
  my_dup2(fd, fd2);
  printf("fd#%d -> fd#%d\n", fd2, fd);
  if( write(fd2, buf, 9) != 9)
    err_sys("write error");

  exit(0);
}


int
my_dup2(int filedes,int filedes2)
{
  int fd_rec[OPEN_MAX];
  int fd,i,n;
 
  if( filedes == filedes2)  //類比dup2的行為,當filedes2等於filedes時,直接返回filedes即可
    return filedes;

  for(n=0 ; (fd=dup(filedes)) < filedes2; n++){  //由於dup2總返回當前可用檔案描述符的最小值,因此要不斷嘗試
    fd_rec[n] = fd;  //儲存嘗試的檔案描述符,以便後面關閉
  }
  if( fd != filedes2)  //退出迴圈的條件也可能由於filedes2已被佔用,這時dup2的行為是先將其關閉
  {
    close(filedes2);
    fd = dup(filedes);
  }
  //關閉開啟的非目標檔案描述符
  for(i=0; i<n; i++)
    close(fd_rec[i]);
 
  return fd;
}
 linux bash shell中常常會使用到命令的輸入輸出重新導向符號。例如,《APUE》中程式3-4的使用       $  a.out  <  /dev/tty     //將程式輸入重新導向為/dev/tty       $  a.out  >  tmp.foo      //將程式輸出重新導向至檔案temp.foo       $  a.out  2>>  temp.foo     //在檔案描述符2上開啟檔案temp.foo以供添寫,通常程式出錯時會向fd#2上寫入相關錯誤資訊       $  a.out  5<>temp.foo     //在fd#5上開啟檔案temp.foo以供讀、寫檔案描述符通常有幾個值是被系統保留使用的,預設地,0-標準輸入,1-標準輸出,2-錯誤輸出。
  • 在沒有這些重新導向符號時,shell會在運行命令程式前的準備階段,初始化fd#0、fd#1、fd#3的指向。
  • 使用重新導向符時,指定檔案描述符上開啟檔案的工作也是在shell運行命令程式前準備階段完成的。

對於my_dup2的測試,

    $  my_dup2   2   17

將在螢幕上輸出"It works!";

    $  my_dup2   7 17  7<>/dev/fd/1

也將輸出"It works!";

    $    my_dup2   2   17  17>tmp.foo

螢幕輸出"It words!",但tmp.foo中沒有任何記錄。

APUE習題3.2以及shell中重新導向符號的使用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.