考虑到在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?
或者应该做些什么来确保打开的频道不与另一个频道冲突,比如我猜的唯一文件描述符?
在下面的示例代码中,printf如何知道uint8_t应该打印的大小,而上述格式只是"0x%x"而passd类型是uint32_t?printf怎么知道在第一次调用时它必须打印4个字节而第二个调用它必须只打印1个字节?
uint32_t X = 0xAABBCCDD;
printf("uint32_t 0x%x\n", (uint32_t) X);
printf("uint8_t 0x%x\n", (uint8_t) X);
Run Code Online (Sandbox Code Playgroud)
产量
uint32_t 0xaabbccdd
uint8_t 0xdd
Run Code Online (Sandbox Code Playgroud)