Now, according to this v2 patch, just linux be effected, so it's portable. Can you apply this now?
According to the Linux kernel code, we know that the sigqueue is allocated and queue the signal to it's list by the system call rt_sigqueueinfo(2) which called by sigqueue(3) in this test code. Meanwhile, if the signal is queued, it increase the user's sigpending field. Then if it going to queue another signal, it read the rlimit of the sigpending from the task's signal->rlim[] member and compare with the user's current sigpending number. So, it's the issue. The user who is running this code may have other pending signals before this, and actually it does. This patch read the pending signal's number from the /proc/<pid>/status and minus it. Eliminate the impact of other pending signals. Signed-off-by: Wanlong Gao <[email protected]> Signed-off-by: Peng Haitao <[email protected]> --- .../conformance/interfaces/sigqueue/9-1.c | 66 ++++++++++++++++++-- 1 files changed, 61 insertions(+), 5 deletions(-) diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sigqueue/9-1.c b/testcases/open_posix_testsuite/conformance/interfaces/sigqueue/9-1.c index 6320384..8074957 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/sigqueue/9-1.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/sigqueue/9-1.c @@ -29,17 +29,73 @@ #include <unistd.h> #include <stdlib.h> #include <errno.h> +#include <string.h> +#include <fcntl.h> #include "posixtest.h" void myhandler(int signo, siginfo_t *info, void *context) { printf ("Inside Handler\n"); } +#ifndef __linux +void get_sigpending(int pid, long *current) {}; +#else +void get_sigpending(int pid, long *current) +{ + int fd, len; + char procdir[128] = ""; + char line[1024] = ""; + char *pos, *pos2, *sig; + + snprintf(procdir, sizeof(procdir) - 1, "/proc/%d/status", pid); + procdir[sizeof(procdir) - 1] = '\0'; + + fd = open(procdir, O_RDONLY); + if (fd == -1) { + perror("Can't open the proc file"); + return; + } + + len = read(fd, line, sizeof(line) - 1); + close(fd); + + if (len <= 0) { + perror("Read file error"); + return; + } else { + line[len] = '\0'; + } + + pos = strstr(line, "SigQ:"); + if (pos == NULL) { + printf("Can't find the SigQ: string.\n"); + return; + } + + pos2 = strchr(pos, '\n'); + if (pos2 == NULL) { + printf("Can't get the position of the newline character.\n"); + return; + } + + sig = pos; + sig[pos2 - pos] = '\0'; + sig = strrchr(sig, '\t'); + if (sig == NULL) { + printf("Can't find the tab character.\n"); + return; + } + + if (sscanf(sig, "%ld", current) != 1) + perror("Can't get the current value"); +} +#endif + int main() { - int pid, i; - long syslimit; + int pid; + long curr, syslimit; union sigval value; struct sigaction act; @@ -63,8 +119,8 @@ int main() " not a bug.\n"); return PTS_PASS; } - - for (i=0; i<syslimit; i++) { + get_sigpending(pid, &curr); + for (; curr < syslimit; curr++) { if (sigqueue(pid, SIGTOTEST, value) != 0) { printf("Test UNRESOLVED: call to sigqueue did not return success\n"); return PTS_UNRESOLVED; @@ -81,4 +137,4 @@ int main() } return PTS_PASS; -} \ No newline at end of file +} -- 1.7.6 ------------------------------------------------------------------------------ AppSumo Presents a FREE Video for the SourceForge Community by Eric Ries, the creator of the Lean Startup Methodology on "Lean Startup Secrets Revealed." This video shows you how to validate your ideas, optimize your ideas and identify your business strategy. http://p.sf.net/sfu/appsumosfdev2dev _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
