提交 3d5f21ee 创建 作者: rtm's avatar rtm

test concurrent open/unlink of same file (ok)

test files with holes (not ok)
上级 68ae4cc1
...@@ -139,6 +139,76 @@ writetest1(void) ...@@ -139,6 +139,76 @@ writetest1(void)
} }
void void
writetest2(void)
{
int fd, fd1, n;
printf(stdout, "files with holes\n");
fd = open("hole", O_CREATE|O_RDWR);
if(fd < 0){
printf(stdout, "error: creat hole failed!\n");
exit();
}
buf[0] = 1;
if(write(fd, buf, 512) != 512) {
printf(stdout, "error: write hole file failed\n");
exit();
}
// now truncate, while fd is still open
fd1 = open("hole", O_CREATE | O_RDWR);
if(fd < 0){
printf(stdout, "error: 2nd creat hole failed!\n");
exit();
}
close(fd1);
// now write another block, should be 2nd in file
buf[0] = 2;
if(write(fd, buf, 512) != 512) {
printf(stdout, "error: 2nd write hole file failed\n");
exit();
}
close(fd);
fd = open("hole", O_RDONLY);
if(fd < 0){
printf(stdout, "error: open hole failed!\n");
exit();
}
n = read(fd, buf, 512);
if(n != 512){
printf(stdout, "error: 1st hole read failed\n");
exit();
}
if(buf[0] != 0){
printf(stdout, "error: 1st hole block didn't have zeros\n");
exit();
}
n = read(fd, buf, 512);
if(n != 512){
printf(stdout, "error: 2nd hole read failed\n");
exit();
}
if(buf[0] != 1){
printf(stdout, "error: 2nd hole block wrong content\n");
exit();
}
close(fd);
if(unlink("hole") < 0) {
printf(stdout, "unlink hole failed\n");
exit();
}
printf(stdout, "hole files ok\n");
}
void
createtest(void) createtest(void)
{ {
int i, fd; int i, fd;
...@@ -461,7 +531,7 @@ twofiles(void) ...@@ -461,7 +531,7 @@ twofiles(void)
printf(1, "twofiles ok\n"); printf(1, "twofiles ok\n");
} }
// two processes create and delete files in same directory // two processes create and delete different files in same directory
void void
createdelete(void) createdelete(void)
{ {
...@@ -647,7 +717,7 @@ linktest(void) ...@@ -647,7 +717,7 @@ linktest(void)
printf(1, "linktest ok\n"); printf(1, "linktest ok\n");
} }
// test concurrent create of the same file // test concurrent create and unlink of the same file
void void
concreate(void) concreate(void)
{ {
...@@ -713,7 +783,22 @@ concreate(void) ...@@ -713,7 +783,22 @@ concreate(void)
for(i = 0; i < 40; i++){ for(i = 0; i < 40; i++){
file[1] = '0' + i; file[1] = '0' + i;
unlink(file); pid = fork();
if(pid < 0){
printf(1, "fork failed\n");
exit();
}
if(((i % 3) == 0 && pid == 0) ||
((i % 3) == 1 && pid != 0)){
fd = open(file, 0);
close(fd);
} else {
unlink(file);
}
if(pid == 0)
exit();
else
wait();
} }
printf(1, "concreate ok\n"); printf(1, "concreate ok\n");
...@@ -1095,6 +1180,7 @@ main(int argc, char *argv[]) ...@@ -1095,6 +1180,7 @@ main(int argc, char *argv[])
opentest(); opentest();
writetest(); writetest();
writetest1(); writetest1();
writetest2();
createtest(); createtest();
mem(); mem();
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论