2

对于作业,我们必须创建功能类似于 cat 命令的 C 程序。第一次提交要求它模仿 cat.... 的极少操作,即打印到输出、重定向。我遇到的问题是一个要求是在驻留在 USB 驱动器上的输出文件丢失的情况下打印错误,即在将标准输出重定向到它时拔出 USB。

我如何捕获这样的错误,以及如何为该特定错误执行测试用例?

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

更新代码温度

 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. 优雅地退出

编辑:

我在想两件事:

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

你可以这样做

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

2:如果您在检测到文件删除时被要求退出,那么您需要监视目录。幸运的是,您只查看一个目录。然而,该while循环阻碍了事情的发展,因为getchar()它是一个阻塞函数(在发生某些事情之前不能返回)。您应该使用inotify来监视目录,然后可能轮询以轮询inotify(). 当我这样做时,我使用了选择,因为我们被迫这样做。

某种想法如何监视目录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()请注意,此代码将仅检测一个事件,并在语句处阻塞。

于 2013-03-02T09:05:58.803 回答