猫终端,检查usb删除(perror)?

时间:2013-03-02 04:46:40

标签: c terminal usb cat

对于赋值,我们必须创建与cat命令类似的C程序。第一次切入要求它模仿猫的非常小的操作....即打印到输出,重定向。我遇到的问题是,一个要求是在出现在usb驱动器上的输出文件丢失的情况下打印错误,即在将stdout重定向到它时将其拉出。

如何捕获此类错误,以及如何针对该特定错误执行测试用例?

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

更新代码TEMP

 int main(){
    char c;

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

    return EXIT_SUCCESS;
}

1 个答案:

答案 0 :(得分:0)

假设您使用的fprintf()来自man pages

  

成功时,将返回写入的字符总数。

所以:

  1. 将您要写入的char数组的大小存储到变量x
  2. 如果fprintf()小于x,则写入被中断。
  3. 优雅地退出
  4. 编辑:

    我正在考虑两件事:

    1:putchar()失败时,表示写入文件时出错。由于写入一个字节不需要很长时间,因此一旦写入字节(或假设)它将处于安全状态,这应该是不可能的。

    你可以这样做

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

    2:如果要求您在检测到文件删除的瞬间退出,则需要监控目录。幸运的是,你只看一个目录。但是while循环阻碍了事情的发生,因为getchar()是一个阻塞函数(在发生某些事情之前无法返回)。您应该使用inotify来监视目录,然后可能poll轮询inotify()的文件描述符。当我这样做时,我使用select,因为我们被迫。{/ p>

    如何使用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()语句处阻塞。