Sponsored Content
Top Forums Programming select() system call takes longer than the timeout specified Post 302410945 by Driver on Wednesday 7th of April 2010 08:07:16 AM
Old 04-07-2010
Quote:
where sockfd is one of the fd's select is calling. You HAVE to do this or you break select(). Period.

I dunno what the libcurl folks did, but I think this is your problem - blocking.
Just from looking at that single post and its title, I believe you misunderstood the discussion/conclusion in that thread.

When the kernel people speak of "breaking" select(), they mean altering the behavior of their select() implementation. The topic of that debate seems to be whether a select() hit on a blocking socket GUARANTEES that a subsequent recvmsg() call will not block. It doesn't guarantee that, but most programmers expect it to, hence the question of whether it is right for select() to "lie" about state.

However, select() is better thought of as a temporary snapshot of I/O state. If select() indicates readability on a file descriptor, that does not mean that a subsequent read operation is guaranteed not to block.

Likewise, if stat() indicates that a file is 1363 bytes big, that does not mean that a subsquent open() + read() will be able to retrieve 1363 bytes from it because the file may have been deleted or resized in the meantime.

-------------

As for the original problem:

As others have stated, I also believe that you should make sure you are really measuring the right thing. It is highly unlikely that select() doesn't behave "as advertised".

Make sure that your gettimeofday() calls only measure select(). Perhaps you didn't just measure select() but also time for reading and processing data?

When you used gettimeofday() to record time, did you also make sure to use those same data structures when printing the time difference? How did you print it - did you maybe mix up seconds and microseconds? Are you sure your print statements aren't adding any extra delay because you didn't flush or unbuffer your output file?

Please post your real code. What you posted originally does not contain the gettimeofday() calls you said you used to measure it.

jim mcnamara's suggestion to trace the process is also good - If possible, run your program through "strace ./prog" and see whether it really spends a long time in select().
 

10 More Discussions You Might Find Interesting

1. UNIX for Advanced & Expert Users

how to differentiate system call from library call

Hi, Ho do I differentiate system call from library call? for example if I am using chmod , how do I find out if it is a system call or library call? Thanks Muru (2 Replies)
Discussion started by: muru
2 Replies

2. UNIX for Advanced & Expert Users

Login Process takes longer

Hello. Since Yesterday, I notice that after giving telnet IP or SSH IP - it takes long time to display login: , I mean earlier after entering Server name It used to immediately ask for login ID and then password. But, now it takes min of 2-3 minute to ask for password. Where can I check,... (12 Replies)
Discussion started by: panchpan
12 Replies

3. UNIX for Advanced & Expert Users

how to use exceptfds argument in select system call

Hi, Can any one tell me how to use the fourth argument of select system call.I saw example "port forwarding" on the net,but it was too complex for me to understand.Can any one explain me about the usage of exceptfds argument of select system call with simple example. Thanks. (2 Replies)
Discussion started by: bvijaya
2 Replies

4. UNIX and Linux Applications

Syb15 Query takes longer, help me out

When i run the below query in syb15 (with syb 12.5.X backward compatibilty) environment it runs 45min where as the same in syb12.5.1 it takes only 7-10min. But the main thing is stld_date(in the below query) does not covered in the index of that table. Also main_table is a huge table. So is it... (1 Reply)
Discussion started by: prsam
1 Replies

5. Programming

Having some trouble with select() call in C

I have this while loop: while (notdone) { //Set the timers waitd.tv_sec = 5; waitd.tv_usec = 0; FD_ZERO(&tempreadfds); FD_ZERO(&tempwritefds); FD_ZERO(&readfds); /* initialize the read fd set */ FD_ZERO(&writefds); /* initialize the write fd set */ ... (1 Reply)
Discussion started by: Legend986
1 Replies

6. Shell Programming and Scripting

script to monitor the process system when a process from user takes longer than 15 min run.

get email notification from from system when a process from XXXX user takes longer than 15 min run.Let me know the time estimation for the same. hi ,any one please tell me , how to write a script to get email notification from system when a process from as mentioned above a xxxx user takes... (1 Reply)
Discussion started by: kirankrishna3
1 Replies

7. Shell Programming and Scripting

system call

Trying to figure out a load issue with a webserver. I have traced a php script and noticed the following connect(4, {sa_family=AF_INET, sin_port=htons(3306), sin_addr=inet_addr("XX.XX.XX.XX")}, 16) = -1 EINPROGRESS (Operation now in progress) <0.000035> poll(, 1, 2000) = 1 () <0.000120>... (5 Replies)
Discussion started by: rajan007
5 Replies

8. Homework & Coursework Questions

program to send messages to parent using pipes and select system call

Write a program using select, which will create some number of child processes that continuously send text messages to the parent process using pipes. Each child has its own pipe that it uses to communicate with the parent. The parent uses select () to decide what pipes should be processed to... (1 Reply)
Discussion started by: ripssingh
1 Replies

9. UNIX for Advanced & Expert Users

Issues with select system call

1. We are using client-server model communication using TCP/IP protocol 2. The TCP socket created with O_NON_BLOCK flag 3. When we make attempt to send large data to other process, the send is partially successful. It means we attempt to send 90K data, OS sent only 40K data successfully. ... (3 Replies)
Discussion started by: MasthanDudekula
3 Replies

10. Shell Programming and Scripting

Timeout to abolish ssh connection command it takes too long

Hi, I am running a ssh connection test in a script, how can I add a timeout to abolish the process if it takes too long? ssh -i ~/.ssh/ssl_key useraccount@computer1 Thank you. - j (1 Reply)
Discussion started by: hce
1 Replies
explain_select(3)					     Library Functions Manual						 explain_select(3)

NAME
explain_select - explain select(2) errors SYNOPSIS
#include <sys/select.h> #include <libexplain/select.h> const char *explain_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); const char *explain_errno_select(int errnum, int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); void explain_message_select(char *message, int message_size, int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); void explain_message_errno_select(char *message, int message_size, int errnum, int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); DESCRIPTION
These functions may be used to obtain explanations for errors returned by the select(2) system call. explain_select const char *explain_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); The explain_select function is used to obtain an explanation of an error returned by the select(2) system call. The least the message will contain is the value of strerror(errno), but usually it will do much better, and indicate the underlying cause in more detail. The errno global variable will be used to obtain the error value to be decoded. This function is intended to be used in a fashion similar to the following example: if (select(nfds, readfds, writefds, exceptfds, timeout) < 0) { fprintf(stderr, "%s ", explain_select(nfds, readfds, writefds, exceptfds, timeout)); exit(EXIT_FAILURE); } nfds The original nfds, exactly as passed to the select(2) system call. readfds The original readfds, exactly as passed to the select(2) system call. writefds The original writefds, exactly as passed to the select(2) system call. exceptfds The original exceptfds, exactly as passed to the select(2) system call. timeout The original timeout, exactly as passed to the select(2) system call. Returns: The message explaining the error. This message buffer is shared by all libexplain functions which do not supply a buffer in their argument list. This will be overwritten by the next call to any libexplain function which shares this buffer, including other threads. Note: This function is not thread safe, because it shares a return buffer across all threads, and many other functions in this library. explain_errno_select const char *explain_errno_select(int errnum, int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); The explain_errno_select function is used to obtain an explanation of an error returned by the select(2) system call. The least the mes- sage will contain is the value of strerror(errnum), but usually it will do much better, and indicate the underlying cause in more detail. This function is intended to be used in a fashion similar to the following example: if (select(nfds, readfds, writefds, exceptfds, timeout) < 0) { int err = errno; fprintf(stderr, "%s ", explain_errno_select(err, nfds, readfds, writefds, exceptfds, timeout)); exit(EXIT_FAILURE); } errnum The error value to be decoded, usually obtained from the errno global variable just before this function is called. This is neces- sary if you need to call any code between the system call to be explained and this function, because many libc functions will alter the value of errno. nfds The original nfds, exactly as passed to the select(2) system call. readfds The original readfds, exactly as passed to the select(2) system call. writefds The original writefds, exactly as passed to the select(2) system call. exceptfds The original exceptfds, exactly as passed to the select(2) system call. timeout The original timeout, exactly as passed to the select(2) system call. Returns: The message explaining the error. This message buffer is shared by all libexplain functions which do not supply a buffer in their argument list. This will be overwritten by the next call to any libexplain function which shares this buffer, including other threads. Note: This function is not thread safe, because it shares a return buffer across all threads, and many other functions in this library. explain_message_select void explain_message_select(char *message, int message_size, int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); The explain_message_select function may be used to obtain an explanation of an error returned by the select(2) system call. The least the message will contain is the value of strerror(errno), but usually it will do much better, and indicate the underlying cause in more detail. The errno global variable will be used to obtain the error value to be decoded. This function is intended to be used in a fashion similar to the following example: if (select(nfds, readfds, writefds, exceptfds, timeout) < 0) { char message[3000]; explain_message_select(message, sizeof(message), nfds, readfds, writefds, exceptfds, timeout); fprintf(stderr, "%s ", message); exit(EXIT_FAILURE); } message The location in which to store the returned message. If a suitable message return buffer is supplied, this function is thread safe. message_size The size in bytes of the location in which to store the returned message. nfds The original nfds, exactly as passed to the select(2) system call. readfds The original readfds, exactly as passed to the select(2) system call. writefds The original writefds, exactly as passed to the select(2) system call. exceptfds The original exceptfds, exactly as passed to the select(2) system call. timeout The original timeout, exactly as passed to the select(2) system call. explain_message_errno_select void explain_message_errno_select(char *message, int message_size, int errnum, int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); The explain_message_errno_select function may be used to obtain an explanation of an error returned by the select(2) system call. The least the message will contain is the value of strerror(errnum), but usually it will do much better, and indicate the underlying cause in more detail. This function is intended to be used in a fashion similar to the following example: if (select(nfds, readfds, writefds, exceptfds, timeout) < 0) { int err = errno; char message[3000]; explain_message_errno_select(message, sizeof(message), err, nfds, readfds, writefds, exceptfds, timeout); fprintf(stderr, "%s ", message); exit(EXIT_FAILURE); } message The location in which to store the returned message. If a suitable message return buffer is supplied, this function is thread safe. message_size The size in bytes of the location in which to store the returned message. errnum The error value to be decoded, usually obtained from the errno global variable just before this function is called. This is neces- sary if you need to call any code between the system call to be explained and this function, because many libc functions will alter the value of errno. nfds The original nfds, exactly as passed to the select(2) system call. readfds The original readfds, exactly as passed to the select(2) system call. writefds The original writefds, exactly as passed to the select(2) system call. exceptfds The original exceptfds, exactly as passed to the select(2) system call. timeout The original timeout, exactly as passed to the select(2) system call. SEE ALSO
select(2) blah blah explain_select_or_die(3) blah blah and report errors COPYRIGHT
libexplain version 0.52 Copyright (C) 2008 Peter Miller explain_select(3)
All times are GMT -4. The time now is 03:39 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy