From: Kang K. <Kai...@wi...> - 2012-09-03 08:45:58
|
On 2012年08月09日 18:30, Kang Kai wrote: Hi Wanlong, > In this test case, it uses a variable to share data between child and > parent processes. But after fork there is a copy of the variable in > child process and modify it will not affect the variable in the parent > process. Then when the child process call mq_open() before parent process, > the case will fail. > > Use tmp file to replace the variable. Any modification in child process > can be seen in parent process. Any comment for this patch? Thanks, Kai > > Signed-off-by: Kang Kai<kai...@wi...> > --- > .../conformance/interfaces/mq_open/16-1.c | 38 +++++++++++++++++-- > 1 files changed, 34 insertions(+), 4 deletions(-) > > diff --git a/testcases/open_posix_testsuite/conformance/interfaces/mq_open/16-1.c b/testcases/open_posix_testsuite/conformance/interfaces/mq_open/16-1.c > index b9a3215..ebd697b 100644 > --- a/testcases/open_posix_testsuite/conformance/interfaces/mq_open/16-1.c > +++ b/testcases/open_posix_testsuite/conformance/interfaces/mq_open/16-1.c > @@ -20,9 +20,11 @@ > * this is fine (will have some false positives, but no false negatives). > */ > > +#include<sys/mman.h> > #include<sys/stat.h> > #include<sys/types.h> > #include<sys/wait.h> > +#include<errno.h> > #include<fcntl.h> > #include<mqueue.h> > #include<signal.h> > @@ -32,11 +34,15 @@ > #include "posixtest.h" > > #define NAMESIZE 50 > +#define TNAME "mq_open/16-1.c" > > int main() > { > char qname[NAMESIZE]; > + char fname[NAMESIZE]; > int pid, succeeded=0; > + int fd; > + void *pa = NULL; > mqd_t childqueue, queue; > > /* > @@ -47,6 +53,26 @@ int main() > > sprintf(qname, "/mq_open_16-1_%d", getpid()); > > + sprintf(fname, "/tmp/pts_mq_open_16_1_%d", getpid()); > + unlink(fname); > + fd = open(fname, O_CREAT | O_RDWR | O_EXCL, > + S_IRUSR | S_IWUSR); > + if (fd == -1) { > + printf(TNAME " Error at open(): %s\n", strerror(errno)); > + exit(PTS_UNRESOLVED); > + } > + /* file is empty now, will cause "Bus error" */ > + write(fd, "\0", 1); > + unlink(fname); > + > + pa = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); > + if (pa == MAP_FAILED) { > + printf(TNAME " Error at mmap: %s\n", strerror(errno)); > + close(fd); > + exit(PTS_FAIL); > + } > + *(int *)pa = 0; > + > if ((pid = fork()) == 0) { > sigset_t mask; > int sig; > @@ -62,7 +88,7 @@ int main() > childqueue = mq_open(qname, O_CREAT|O_EXCL|O_RDWR, > S_IRUSR | S_IWUSR, NULL); > if (childqueue != (mqd_t)-1) { > - succeeded++; > + ++*(int *)pa; > #ifdef DEBUG > printf("mq_open() in child succeeded\n"); > } else { > @@ -79,7 +105,7 @@ int main() > queue = mq_open(qname, O_CREAT | O_EXCL |O_RDWR, > S_IRUSR | S_IWUSR, NULL); > if (queue != (mqd_t)-1) { > - succeeded++; > + ++*(int *)pa; > #ifdef DEBUG > printf("mq_open() in parent succeeded\n"); > } else { > @@ -93,13 +119,15 @@ int main() > mq_close(queue); > mq_close(childqueue); > mq_unlink(qname); > + close(fd); > + munmap(pa, sizeof(int)); > return PTS_UNRESOLVED; > } > > mq_close(queue); > mq_close(childqueue); > mq_unlink(qname); > - > + succeeded = *(int *)pa; > if (succeeded==0) { > printf("Test FAILED - mq_open() never succeeded\n"); > return PTS_FAIL; > @@ -111,8 +139,10 @@ int main() > } > > printf("Test PASSED\n"); > + close(fd); > + munmap(pa, sizeof(int)); > return PTS_PASS; > } > > return PTS_UNRESOLVED; > -} > \ No newline at end of file > +} |