Moh*_*bil 2 c sockets multithreading signals sigpipe
考虑到在Linux上是C语言的新手,我已经走过了套接字编程场景,你必须处理SIGPIPE问题,并且我遇到了令人烦恼的情况:
1-抓住进程的sigaction然后继续,这等于忽略信号.
struct sigaction sginal_action;
memset(&sginal_action, 0, sizeof (sginal_action));
sginal_action.sa_handler = SIG_IGN;
sginal_action.sa_flags = SA_RESTART;
if (sigaction(SIGPIPE, &sginal_action, null)) {
perror("signal action error");
}
Run Code Online (Sandbox Code Playgroud)
2-忽略线程上的信号使用
sigset_t sigpipe_mask;
sigemptyset(&sigpipe_mask);
sigaddset(&sigpipe_mask, SIGPIPE);
sigset_t saved_mask;
if (pthread_sigmask(SA_RESTART, &sigpipe_mask, &saved_mask) == -1) {
perror("pthread_sigmask");
}
Run Code Online (Sandbox Code Playgroud)
- 现在每件事情都能正常工作但是我需要一个关于这个测试用例行为的答案:
1-服务器接受来自用户A的套接字带文件discriptor int 7
2-我运行冗长的SQL语句,需要25个secondes
3-在第二个20个客户端关闭套接字
4-秒21 Linux内核发送SIGPIPE
5-第二个22进程忽略了SIGPIPE并继续使用文件描述符7,因为没有信号出现任何问题
6-在第二个23服务器接受来自用户B的套接字带文件discriptor int 7再一次!
7-用户B的授权需要2秒应在用户A的第二25完成
8- 核心问题开始在第二25写入(file_dsciptor,缓冲液,BUFFER_SIZE); 来自两个线程的数据都会将数据写入用户A和用户B通道
9-如果用户B没有被授权登录到服务器但是在服务器关闭文件描述符7在线程B之前,客户端A的线程A写入文件描述符7并且由于套接字文件描述符7的重用,客户端B收到了重要数据!
我的问题
是,这种情况是错误的,永远不会发生?
或者有可能发生但是有正确的方法可以应用吗?
是否有一个C系统调用函数来停止通过套接字连接重新使用file_discriptor?
或者应该做些什么来确保打开的频道不与另一个频道冲突,比如我猜的唯一文件描述符?
(正常)SIGPIPE本质上是一个同步信号.你得到它是为了回应你所做的,它试图写入另一方关闭的管道/插座/ FIFO.忽略SIGPIPE是非常无害的,因为如果你这样做,你仍然会通常报告同步错误的错误:通过失败的返回码并errno设置为适当的错误号(EPIPE).在这种情况下,我认为忽略SIGPIPE继续检查错误是最好的方法,无论你在哪个POSIX平台.
关于你的例子,你在第5点的假设是"没有信号出现任何问题"是不正确的.会有一个信号.它不会是一个信号,而是EPIPE一个write通话失败.
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |