2

割り当てのために、cat コマンドと同様に機能する C プログラムを作成する必要があります。最初のハンドインでは、cat の非常に最小限の操作を模倣する必要があります。つまり、出力から出力、リダイレクトなどです。私が抱えている問題は、USBドライブにある出力ファイルが失われた場合、つまりstdoutをリダイレクトしている間にusbが引き抜かれた場合にエラーを出力することが1つの要件であるということです。

そのようなエラーをキャッチするにはどうすればよいですか?また、その特定のエラーのテストケースを実行するにはどうすればよいですか??

どうもありがとう....本当にわからない

コード温度の更新

 int main(){
    char c;

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

    return EXIT_SUCCESS;
}
4

1 に答える 1

0

を使用していると仮定するとfprintf()マニュアルページから:

成功すると、書き込まれた文字の総数が返されます。

それで:

  1. char変数に書き込む配列のサイズを格納しますx
  2. fprintf()未満の場合、x書き込みは中断されました。
  3. 優雅に終了します

編集:

私が考えていることは2つあります。

1:putchar()失敗した場合は、ファイルへの書き込み時にエラーを示します。1バイトの書き込みはそれほど長くはかからないため、バイトが書き込まれると(または想定して)安全な状態になるため、これは起こりそうにありません。

あなたはそうすることができます

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

2:ファイルの削除を検出した瞬間に終了するように求められた場合は、ディレクトリを監視する必要があります。幸いなことに、あなたは1つのディレクトリしか見ていません。ただし、これはブロッキング関数whileであるため、そのループは物事の邪魔になりgetchar()ます(何かが発生するまで戻ることはできません)。inotifyを使用してディレクトリを監視してから、おそらくポーリングしてのファイル記述子をポーリングする必要があります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_DELETEディレクトリを追加するときに使用する属性(またはなど)を確認する必要があります。これらの属性によって、イベントIN_MODIFYをトリガーする属性が決まるためです。inotify()このコードは1つのイベントのみを検出し、read()ステートメントでブロックすることに注意してください。

于 2013-03-02T09:05:58.803 に答える