Стандартная проверка активности потока (язык C)
Я изучаю оконные сокеты на языке Си и пишу мультиплексирующее клиент-серверное приложение ввода-вывода, которое пытаюсь работать со стандартными потоками. Я хочу проверить себя
stdin, stdout and stderrно, похоже, я не могу понять, как это работает. Входной поток это, например,когда я использую функцию printf или открываю какой - то файл (fopen, fopen_s), выходной-чтение сообщения от клиента serverby, чтение строк из fileand errorthread-просто проверка ошибок (с помощью fprintf(errno, "param2", param3).
Что я уже пробовал:
Я хочу проверить активность этого потока и пишу программу просто для того, чтобы посмотреть, как он работает, но я встретил какого-то Иссу.Я не понимаю, как проверить эту активность (да, может быть, это звучит глупо, но я действительно застрял с этим).
Я хочу сделать это с помощью функции select (), а затем FD_ZERO и FD_SET. Как мне узнать, какой сокет активен, а какой нет? Как сделать их активными?
Вот мой код "scelet" :
<pre> #pragma comment(lib, "ws2_32.lib") #define _WINSOCK_DEPRECATED_NO_WARNINGS #include <winsock2.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #define BUFFERSIZE 64 #define PORT 3765 #define SERVERADDR argv[1] int main(int argc, char *argv[]) { struct sockaddr_in serverAddr = { 0 }; fd_set readSD; fd_set writeSD; fd_set errorSD; timeval tv; int retVal; char msg = '1'; FD_ZERO(&readSD); FD_ZERO(&writeSD); FD_ZERO(&errorSD); FD_SET(msg, &readSD); FD_SET(msg, &writeSD); FD_SET(msg, &errorSD); tv.tv_sec = 5; retVal = select(msg + 1, &readSD, &writeSD, &errorSD, &tv); if (retVal < 0) { printf("Error\n"); return -1; } else if (retVal == 0) { printf("There is nobody, sorry\n"); } else { int fd_isset_r = FD_ISSET(msg, &readSD); if ((fd_isset_r)!=0) { printf("fd_isset_r error\n"); } else { printf("readSD is %s \n", FD_ISSET(msg, &readSD) ? "ready" : "not ready"); } int fd_isset_w = FD_ISSET(msg, &writeSD); if ((fd_isset_w) != 0) { printf("fd_isset_w error\n"); } else { printf("writeSD is %s\n", FD_ISSET(msg, &writeSD) ? "ready" : "not ready"); } int fd_isset_er = FD_ISSET(msg, &errorSD); if ((fd_isset_er) != 0) { printf("fd_isset_er error\n"); } else { printf("errorSD is %s\n", FD_ISSET(msg, &errorSD) ? "ready" : "not ready"); } } system("pause"); return 0; }
Я очень ценю любые советы и помощь. Спасибо