2013-03-02 54 views
2

對於作業,我們必須創建類似於cat命令的C程序。第一次進入要求它模仿貓的最小操作......即打印輸出,重定向。我遇到的問題是,一個要求是在USB驅動器上的輸出文件丟失的情況下輸出錯誤,即在將stdout重定向到usb時拔出usb。貓終端,檢查usb刪除(perror)?

如何捕獲這樣的錯誤,以及如何執行該特定錯誤的測試用例?

非常感謝....真的不知道

更新代碼TEMP

int main(){ 
    char c; 

    while((c = getchar()) != EOF){ 
     putchar(c); 
     // Ensure newly created file exists 
    } 

    return EXIT_SUCCESS; 
} 

回答

0

假設你正在使用fprintf(),從man pages

成功時,返回寫入的字符總數。

所以:

  1. char數組的大小,你會寫入一個變量x
  2. 如果fprintf()小於x時,寫入被中斷。
  3. 出口優雅

編輯:

有兩件事情我在想:

1:putchar()失敗,它寫入文件時顯示錯誤。由於寫入一個字節不會很長,所以這應該不太可能,因爲一旦字節被寫入(或者您認爲),它將處於安全狀態。

你可以做到這一點,像這樣

if(putchar(c) == EOF){ 
    //write error 
} 

2:如果你被要求退出你檢測文件刪除的瞬間,那麼你需要監控的目錄。幸運的是,你只看一個目錄。然而,while循環阻礙了事物的發展,因爲getchar()是一個阻塞函數(在事情發生之前無法返回)。您應該使用inotify來監視目錄,然後可能使用poll輪詢文件描述符inotify()。當我這樣做時,我使用了select,因爲我們被迫。

某種類型的想法如何監視一個目錄,inotify()

int length, i = 0; 
char buffer[EVENT_BUF_LEN]; 
memset(buffer, 0, EVENT_BUF_LEN*sizeof(char)); 
//init inotify 
fd = inotify_init(); 
if(fd < 0){ 
    perror("inotify init"); 
} 
//add directory to watch list 
wd = inotify_add_watch(fd, path , IN_DELETE | 
    IN_DELETE_SELF | IN_MODIFY | IN_MOVE_SELF | IN_MOVED_FROM | IN_MOVED_TO); 
fd_set fds; 
FD_ZERO(&fds); 
FD_SET(fd, &fds); 
//wait for event, since read() blocks 
length = read(fd, buffer, EVENT_BUF_LEN); 
if (length < 0) { 
    perror("zero event length"); 
} 
struct inotify_event *event; 
while (i < length){ 
    //cast the event to a char buffer 
    event = (struct inotify_event*) &buffer[i]; 
    if (event->len){ 
     //this was a custom function of mine 
     storeEvent(event); 
    } 
    i += EVENT_SIZE + event->len; 
} 

你必須檢查哪些屬性添加目錄(如IN_DELETEIN_MODIFY),因爲它們將決定觸發時使用inotify()事件。請注意,此代碼只會檢測到一個事件,並在read()聲明處阻止。

+0

謝謝,但問題是,fprintf創建一個預定義的文件。我必須實現的是,例如: './Cat> redText'並且這個運行在一個while循環中,直到到達EOF。它在這個過程中,我必須確保創建的文件仍然存在。我添加了一個代碼模板,我們得到了原始問題。 請注意,沒有命令行參數,使用getchar/putchar。 – user2125874 2013-03-02 15:25:41

+0

詳細說明了我的回答 – dudeofea 2013-03-02 19:49:08

+0

好吧我認爲它正在做我打算做的事情,我繼續添加if-else以在while循環中檢查'putchar(c)== EOF',但是如何測試此條件。 ..有一種方法來創建一個虛假的EOF – user2125874 2013-03-03 03:12:05