Added two small select() test programs. select_check select()s
stdin/out/err according the what was specified via arguments. select_close_test select()s a file descriptor that is closed a little later by another thread. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22390 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -29,17 +29,20 @@ SimpleTest port_wakeup_test_7 : port_wakeup_test_7.cpp ;
|
|||||||
SimpleTest port_wakeup_test_8 : port_wakeup_test_8.cpp ;
|
SimpleTest port_wakeup_test_8 : port_wakeup_test_8.cpp ;
|
||||||
SimpleTest port_wakeup_test_9 : port_wakeup_test_9.cpp ;
|
SimpleTest port_wakeup_test_9 : port_wakeup_test_9.cpp ;
|
||||||
|
|
||||||
|
SimpleTest select_check : select_check.cpp ;
|
||||||
|
SimpleTest select_close_test : select_close_test.cpp ;
|
||||||
|
|
||||||
SimpleTest syscall_time : syscall_time.cpp ;
|
SimpleTest syscall_time : syscall_time.cpp ;
|
||||||
|
|
||||||
SimpleTest transfer_area_test : transfer_area_test.cpp ;
|
SimpleTest transfer_area_test : transfer_area_test.cpp ;
|
||||||
|
|
||||||
SimpleTest yield_test : yield_test.cpp ;
|
|
||||||
|
|
||||||
SimpleTest wait_test_1 : wait_test_1.c ;
|
SimpleTest wait_test_1 : wait_test_1.c ;
|
||||||
SimpleTest wait_test_2 : wait_test_2.cpp ;
|
SimpleTest wait_test_2 : wait_test_2.cpp ;
|
||||||
SimpleTest wait_test_3 : wait_test_3.cpp ;
|
SimpleTest wait_test_3 : wait_test_3.cpp ;
|
||||||
SimpleTest wait_test_4 : wait_test_4.cpp ;
|
SimpleTest wait_test_4 : wait_test_4.cpp ;
|
||||||
|
|
||||||
|
SimpleTest yield_test : yield_test.cpp ;
|
||||||
|
|
||||||
SetSupportedPlatformsForTarget sigint_bug113_test
|
SetSupportedPlatformsForTarget sigint_bug113_test
|
||||||
: $(HAIKU_BEOS_COMPATIBLE_PLATFORMS) ;
|
: $(HAIKU_BEOS_COMPATIBLE_PLATFORMS) ;
|
||||||
SimpleTest sigint_bug113_test : sigint_bug113_test.cpp ;
|
SimpleTest sigint_bug113_test : sigint_bug113_test.cpp ;
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, const char* const* argv)
|
||||||
|
{
|
||||||
|
const char* config[] = {
|
||||||
|
argc >= 2 ? argv[1] : "rwe",
|
||||||
|
argc >= 3 ? argv[2] : "rwe",
|
||||||
|
argc >= 4 ? argv[3] : "rwe"
|
||||||
|
};
|
||||||
|
|
||||||
|
fd_set readSet;
|
||||||
|
fd_set writeSet;
|
||||||
|
fd_set errorSet;
|
||||||
|
|
||||||
|
FD_ZERO(&readSet);
|
||||||
|
FD_ZERO(&writeSet);
|
||||||
|
FD_ZERO(&errorSet);
|
||||||
|
|
||||||
|
for (int fd = 0; fd < 3; fd++) {
|
||||||
|
if (strchr(config[fd], 'r'))
|
||||||
|
FD_SET(fd, &readSet);
|
||||||
|
if (strchr(config[fd], 'w'))
|
||||||
|
FD_SET(fd, &writeSet);
|
||||||
|
if (strchr(config[fd], 'e'))
|
||||||
|
FD_SET(fd, &errorSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
int result = select(3, &readSet, &writeSet, &errorSet, NULL);
|
||||||
|
fprintf(stderr, "select(): %d\n", result);
|
||||||
|
|
||||||
|
for (int fd = 0; fd < 3; fd++) {
|
||||||
|
fprintf(stderr, "fd %d: %s%s%s\n", fd,
|
||||||
|
FD_ISSET(fd, &readSet) ? "r" : " ",
|
||||||
|
FD_ISSET(fd, &writeSet) ? "w" : " ",
|
||||||
|
FD_ISSET(fd, &errorSet) ? "e" : " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <OS.h>
|
||||||
|
|
||||||
|
|
||||||
|
static status_t
|
||||||
|
close_fd(void* data)
|
||||||
|
{
|
||||||
|
int fd = int(data);
|
||||||
|
snooze(1000000);
|
||||||
|
close(fd);
|
||||||
|
fprintf(stderr, "fd %d closed\n", fd);
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
int fd = dup(0);
|
||||||
|
|
||||||
|
thread_id thread = spawn_thread(close_fd, "close fd", B_NORMAL_PRIORITY,
|
||||||
|
(void*)fd);
|
||||||
|
resume_thread(thread);
|
||||||
|
|
||||||
|
fd_set readSet;
|
||||||
|
FD_ZERO(&readSet);
|
||||||
|
FD_SET(0, &readSet);
|
||||||
|
FD_SET(fd, &readSet);
|
||||||
|
|
||||||
|
fprintf(stderr, "select({0, %d}, NULL, NULL, NULL) ...\n", fd);
|
||||||
|
int result = select(fd + 1, &readSet, NULL, NULL, NULL);
|
||||||
|
fprintf(stderr, "select(): %d\n", result);
|
||||||
|
|
||||||
|
fprintf(stderr, "fd %d: %s\n", 0, FD_ISSET(0, &readSet) ? "r" : " ");
|
||||||
|
fprintf(stderr, "fd %d: %s\n", fd, FD_ISSET(fd, &readSet) ? "r" : " ");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user