对于赋值,我们必须创建与cat命令类似的C程序。第一次切入要求它模仿猫的非常小的操作....即打印到输出,重定向。我遇到的问题是,一个要求是在出现在usb驱动器上的输出文件丢失的情况下打印错误,即在将stdout重定向到它时将其拉出。
如何捕获此类错误,以及如何针对该特定错误执行测试用例?
非常感谢....真的不知道
更新代码TEMP
int main(){
char c;
while((c = getchar()) != EOF){
putchar(c);
// Ensure newly created file exists
}
return EXIT_SUCCESS;
}
答案 0 :(得分:0)
假设您使用的fprintf()
来自man pages:
成功时,将返回写入的字符总数。
所以:
char
数组的大小存储到变量x
fprintf()
小于x
,则写入被中断。编辑:
我正在考虑两件事:
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_DELETE
或IN_MODIFY
)时,您必须检查要使用的属性,因为它们将决定触发inotify()
事件的内容。请注意,此代码仅检测一个事件,并在read()
语句处阻塞。