- 论坛徽章:
- 0
|
我在写一个简化的link-state router的模拟,现在的情况是,需要每秒钟执行一个checking routine,整个过程中都要用recvfrom来接受数据包。把程序简化之后大致是这个样子:
- #include <signal.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- void sig_alrm(int signo) {
- static int cnt = 0;
- printf("Alarm handled: %d\n", ++cnt);
- alarm(1);
- }
- int main() {
- int sockfd, yes = 1;
- struct sockaddr_in my_addr, their_addr;
- unsigned addr_len;
- int nbytes;
- char packet[1000];
- signal(SIGALRM, sig_alrm);
- alarm(1);
- sockfd = socket(PF_INET, SOCK_DGRAM, 0);
- if (sockfd == -1) {
- perror("socket");
- exit(1);
- }
- if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
- perror("setsockopt");
- exit(1);
- }
- my_addr.sin_family = AF_INET;
- my_addr.sin_port = htons(50001);
- my_addr.sin_addr.s_addr = INADDR_ANY;
- memset(&my_addr.sin_zero, 0, sizeof(my_addr.sin_zero));
- if(bind(sockfd, (struct sockaddr*)(&my_addr), sizeof(struct sockaddr)) == -1) {
- perror("bind");
- exit(1);
- }
- addr_len = sizeof(struct sockaddr);
- while(1) {
- if ((nbytes = recvfrom(sockfd, &packet, sizeof(packet), 0, (struct sockaddr*)&their_addr, &addr_len)) == -1) {
- perror("recvfrom");
- exit(1);
- }
- }
- return 0;
- }
复制代码
但在Solaris 10 x86 上运行的时候,总是如下:
Alarm handled: 1
recvfrom: Interrupted system call
就退出了。
我觉得可能是recvfrom在block了进程,等待数据包的时候,出现了SIGALRM,导致程序出错。如果真是这样,有什么办法可以解决呢?如果真的没有办法让recvfrom和alarm共存的话,我想到的一个解决办法是把那个定时运行的routine放到另一个thread里去。大家有什么建议呢?
谢谢。 |
|