2011-05-08 14 views
7

मैं निम्नलिखित कोड डिबगिंग हूँ:recvfrom() अलार्म के साथ टाइमआउट()

signal(SIGALRM, testt);             
alarm(1);                 
result = recvfrom(listening_socket, buf, maxlen, 0, &from, &fromlen); 
printf("stoped\n");   

man 3 siginterrupt ने वर्णन किया है अलार्म प्रणाली कॉल बीच में होना चाहिए, लेकिन मेरे मामले में ऐसा नहीं है। अलार्म हैंडलर का आह्वान किया जाता है, लेकिन recvfrom बाधित नहीं होता है।

हालांकि, जब सिग्नल (2) फ़ंक्शन के साथ एक नया सिग्नल हैंडलर निर्दिष्ट किया जाता है, तो सिस्टम कॉल डिफ़ॉल्ट रूप से बाधित होती है।

अगर मैं अलार्म हैंडलर तो recvfrom सेट करने के बाद siginterrupt(SIGALRM, 1); जोड़ने की उम्मीद के रूप में बाधा आती है।

मुझे क्या याद आ रही है? मेरे कोड में क्या गलत है?

नोट्स: sigaction के साथ बदलना मैं नहीं देख रहा हूं।

+0

ध्यान दें कि 'siginterrupt (3) 'POSIX.1-2008 में अप्रचलित चिह्नित है। – ninjalj

उत्तर

9

siginterrupt(3) मैनपेज गलत था (लिनक्स मैनपेज सेट के version 3.33 त्रुटि को सुधारता है)। ग्लिब के signal का डिफ़ॉल्ट व्यवहार एक संकेत स्थापित करना है जो सिस्टम कॉल को बाधित करता है। आप strace साथ खुद के लिए यह देख सकते हैं:

void handler(int unused) {} 
int main(void) 
{ 
    signal(SIGALRM, handler); 
} 

और longrightarrow;

$ strace -e trace=rt_sigaction ./a.out 
rt_sigaction(SIGALRM, 
      {0x4005b4, [ALRM], SA_RESTORER|SA_RESTART, 0x7fe732d3d490}, 
      {SIG_DFL, [], 0}, 8) = 0 

वहां SA_RESTART पर ध्यान दें। आप या तो कर रहे हैं जो आप कर रहे हैं - हैंडलर स्थापित करने के बाद siginterrupt(SIGALRM, 1) पर कॉल करें - या आप sigaction का उपयोग करने के लिए स्विच कर सकते हैं, जो आपको पहले स्थान पर फ़्लैग सेट करने देगा। आपने कहा था कि आप ऐसा नहीं करना चाहते थे (क्यों?) लेकिन फिर भी मैं यही सिफारिश करूंगा।

+0

टीआईएल स्ट्रेस-ट्रेस = rt_sigaction। यह मेरा कोड नहीं है जो हैंडलर स्थापित करता है। – Alexandru

+1

@Zack: मैनपेज गलत नहीं है, बस गलत है। पूर्ण उद्धरण यह है: 'यदि ध्वज तर्क गलत है (0), तो निर्दिष्ट संकेत सिग द्वारा बाधित होने पर सिस्टम कॉल को पुनरारंभ किया जाएगा। लिनक्स में यह डिफ़ॉल्ट व्यवहार है। हालांकि, जब सिग्नल (2) फ़ंक्शन के साथ एक नया सिग्नल हैंडलर निर्दिष्ट किया जाता है, तो सिस्टम कॉल डिफ़ॉल्ट रूप से बाधित होती है। – ninjalj

+0

@ निंजलज: मुझे लगता है कि मैं बहुत थक गया हूं, सिग्नल() ' ? – Alexandru

संबंधित मुद्दे