我发现了线程实现的一个问题,这对我来说很奇怪。也许你们中的一些人可以向我解释一下,那就太好了。
我正在开发类似代理的程序,它是一个程序(在不同的机器上运行),通过 eth0 接收数据包并通过 ath0 (无线)将其发送到另一台正在执行完全相同操作的机器。实际上我根本不确定是什么导致了我的问题,那是因为我对一切都很陌生,linux和c编程。
我启动两个线程,
- 一个正在 eth0 上侦听(套接字)传入数据包,并通过 ath0(也是套接字)将其发送出去
- 另一个线程正在监听 ath0 并通过 eth0 发送。
如果我使用线程,我会收到这样的错误:
sh-2.05b# ./socketex
Failed to send network header packet.
: Interrupted system call
如果我使用 fork(),程序将按预期工作。
有人可以向我解释这种行为吗?
只是为了展示发送者的实现,这里有它的代码片段:
while(keep_going) {
memset(&buffer[0], '\0', sizeof(buffer));
recvlen = recvfrom(sockfd_in, buffer, BUFLEN, 0, (struct sockaddr *) &incoming, &ilen);
if(recvlen < 0) {
perror("something went wrong / incoming\n");
exit(-1);
}
strcpy(msg, buffer);
buflen = strlen(msg);
sentlen = ath_sendto(sfd, &btpinfo, &addrnwh, &nwh, buflen, msg, &selpv2, &depv);
if(sentlen == E_ERR) {
perror("Failed to send network header packet.\n");
exit(-1);
}
}
UPDATE:我的主文件,启动线程或进程(fork)
int main(void) {
port_config pConfig;
memset(&pConfig, 0, sizeof(pConfig));
pConfig.inPort = 2002;
pConfig.outPort = 2003;
pid_t retval = fork();
if(retval == 0) {
// child process
pc2wsuThread((void *) &pConfig);
} else if (retval < 0) {
perror("fork not successful\n");
} else {
// parent process
wsu2pcThread((void *) &pConfig);
}
/*
wint8 rc1, rc2 = 0;
pthread_t pc2wsu;
pthread_t wsu2pc;
rc1 = pthread_create(&pc2wsu, NULL, pc2wsuThread, (void *) &pConfig);
rc2 = pthread_create(&wsu2pc, NULL, wsu2pcThread, (void *) &pConfig);
if(rc1) {
printf("error: pthread_create() is %d\n", rc1);
return(-1);
}
if(rc2) {
printf("error: pthread_create() is %d\n", rc2);
return(-1);
}
pthread_join(pc2wsu, NULL);
pthread_join(wsu2pc, NULL);
*/
return 0;
}
有帮助吗?
update2011年5月30日
-sh-2.05b# ./wsuproxy 192.168.1.100
mgmtsrvc
mgmtsrvc
Failed to send network header packet.
: Interrupted system call
13.254158,75.165482,DATAAAAAAmgmtsrvc
mgmtsrvc
mgmtsrvc
仍然得到中断的系统调用,如上所示。
我屏蔽了所有信号,如下所示:
sigset_t signal_mask;
sigfillset(&signal_mask);
sigprocmask(SIG_BLOCK, &signal_mask, NULL);
这两个线程在相同的接口上工作,但在不同的端口上。问题似乎仍然出现在同一个地方(请在第一个代码片段中找到它)。我无法更进一步,并且对如何解决该问题没有足够的了解。也许你们中的一些人可以再次帮助我。
提前致谢。