рдирд┐рд╖рд┐рджреНрдз рд╕реВрдЪрдирд╛ рдкреНрд░рд╡рд╛рд╣ (рдЖрдИрдкреА) рдмрдирд╛рдиреЗ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдпрд╣ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд╣реИред рдЗрди IP рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдпрд╣рд╛рдБ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рди рд╣реА рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ред рдореБрдЭреЗ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рдерд╛ рдХрд┐ рдЗрди рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛ред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╕реВрдЪрдирд╛ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рдВрдЧрдарди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛, рдЬреЛ рдХрд┐ рдЗрд╕рдХреЗ рд░рд╛рдЬреНрдп рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджреВрд╕рд░реЗ рд░рд╛рдЬреНрдп рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рдХреЗ рд░рд╛рдЬреНрдп рдХреЗ рдорддрджрд╛рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде, рдПрдХ рдПрдХрд▓ рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рдореЗрдВ рдХрдИ рд╢реНрд░реЛрддрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╛рдж рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрдВрдЯрд░реЗрдХреНрд╢рди рд╡рд╛рддрд╛рд╡рд░рдг рдФрд░ рд╕реВрдЪрдирд╛ рд╡рд┐рдирд┐рдордп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рджреЛрдиреЛрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗред
рддреЛ, рдХреЛрдб рдХреЗ рд▓рд┐рдП! рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд 256 рдереНрд░реЗрдбреНрд╕ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрдмрдХрд┐ рдереНрд░реЗрдбреНрд╕ рдирд╣реАрдВ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
#define MAX_THREADS 256 pthread_t threads[MAX_THREADS];
рд╣рдо рдХреБрдЫ рдЪрд░реЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдереНрд░реЗрдбреНрд╕ рдХреА рд╡рд░реНрддрдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдереНрд░реЗрдбреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ:
int todayThreads = 0; int tomorrowThreads = 0;
рдЕрдм рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦреЗрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдирдП рдмрдирд╛рдП рдЧрдП рдереНрд░реЗрдбреНрд╕ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
void * funcParallel(void * p) { long threadIndex = (long)p; while (true) { usleep(200); if (threadIndex + 1 > tomorrowThreads) { pthread_exit(NULL); return NULL; } } }
рдЕрдм рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рджрд┐рдП рдЧрдП рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛рддрд╛ рд╣реИ:
void changeNumThreads(int num) { tomorrowThreads = num; if (tomorrowThreads > todayThreads) {
рдЕрдм рдореБрдЦреНрдп рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯрд┐рдВрдЧ рд╕рд╛рдЗрдб рд╣реЛрдЧрд╛ рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдмрддрд╛рдПрдЧрд╛ред рдФрд░ рдЬрдм рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдкрд╣рд▓реЗ рд╣рдо рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЪрд▓рддреЗ рд╣реИрдВ, рд╣рдо рдкреАрдЖрдИрдбреА тАЛтАЛрджреЗрдЦрддреЗ рд╣реИрдВред рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рджреВрд╕рд░реА рдХреЙрдкреА рдХреЛ рджреЗрдЦреЗ рдЧрдП рдкреАрдЖрдИрдбреА тАЛтАЛрдХреЗ рдмрд░рд╛рдмрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВред
int main(int argc, char * argv[]) { int pid = getpid(); if (argc == 1) { runSender(pid); } else if (argc == 2) { sscanf(argv[1], "%d", &pid); runReceiver(pid); } else { printf("Usage: unichat [PID]\n"); printf("Examples: unichat\n"); printf(" unichat 2790\n"); } }
рдЕрдм рдЪрд▓реЛ
рд░рдирд╕реЗрдВрдбрд░ () рд╣рд╕реНрддрд╛рдВрддрд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдб рджреЗрдЦреЗрдВред рдпрд╣ рдкреАрдЖрдИрдбреА тАЛтАЛрдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдорд╛рдирдХ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд░реАрдб рдХреИрд░реЗрдХреНрдЯрд░ рдХреЗ рдХреЛрдб рдХреЗ рдмрд░рд╛рдмрд░ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ, 1000 рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИред
void runSender(int pid) { printf("Sender PID = %d\n", pid); while (true) { char ch = getchar(); changeNumThreads(ch); usleep(1000); changeNumThreads(0); usleep(1000); } }
рдпрд╣ рд╣реЛрд╕реНрдЯ рдХреЛрдб рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рд╡рд╣ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХрддрдо рдкреНрд░рд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ 0 рд╣реЛ рдЬрд╛рддреА рд╣реИ (рдореБрдЦреНрдп рдереНрд░реЗрдб рдХреЛ рдЫреЛрдбрд╝рдХрд░) - рдпрд╣ рдПрдХ рдРрд╕реЗ рдЪрд░рд┐рддреНрд░ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХреЛрдб рджреЗрдЦреЗ рдЧрдП рдереНрд░реЗрдбреНрд╕ рдХреЗ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдореБрджреНрд░рдг рдХреЗ рдмрд╛рдж, рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЧреНрд░рд╣реАрдд рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИред
void runReceiver(int pid) { printf("Receive from PID = %d\n", pid); char line[1024]; char filename[1024]; snprintf(filename, sizeof(filename), "/proc/%d/status", pid); int maxThreads = 0; int threads = 0; while (true) { usleep(200); FILE * f = fopen(filename, "rt"); if (f == NULL) { printf("Can't open file %s, error: %d!\n", filename, errno); return; } while (!feof(f)) { fscanf(f, "%s", line); if (feof(f)) break; if (memcmp(line, "Threads:", 8) == 0) { fscanf(f, "%d", &threads); threads--; if ((threads == 0) && (maxThreads != 0)) { printf("%c", maxThreads); fflush(stdout); maxThreads = 0; } else { if (threads > maxThreads) maxThreads = threads; } break; } } fclose(f); } }
рддреЛ рдпрд╣рд╛рдБ рд╣реЛрддрд╛ рд╣реИ:1. рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдПрдВ
2. рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рдирдВрдмрд░ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
12343. рдкреИрд░рд╛рдореАрдЯрд░
1234 рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдПрдВ
4. рдкрд╣рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ, 'a' рдмрдЯрди рджрдмрд╛рдПрдВ
5. рдкреНрд░рдХреНрд░рд┐рдпрд╛
1234 рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ 'a' + 1 = 98 рд╣реЛ рдЬрд╛рддреА рд╣реИ
6. рдореЗрдЬрдмрд╛рди рдХрд╛рд░реНрдпрдХреНрд░рдо рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдлрд╝рд╛рдЗрд▓ / proc /
1234 / рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ)
7. рдореЗрдЬрдмрд╛рди 98 рдХрд╛ тАЛтАЛрдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ
8. рд╕рдВрдЪрд╛рд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдореБрдЦреНрдп рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЛ рдорд╛рд░рддрд╛ рд╣реИ)
9. рд╣реЛрд╕реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ = 1 (рдореБрдЦреНрдп)
10. рдкреНрд░рд╛рдкреНрдд рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реНрдХреНрд░реАрди рдкрд░ рдХреЛрдб 98-1 = 97 = 'рдП' рдХреЗ тАЛтАЛрд╕рд╛рде рдПрдХ рдкреНрд░рддреАрдХ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖:
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдбреЗрдЯрд╛ рдХреЛ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреА рдЧреЛрдкрдиреАрдпрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреА рдЧреЛрдкрдиреАрдпрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рдирд┐рдордп рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЧреЛрдкрдиреАрдпрддрд╛ рдХреЗ рд╕реНрддрд░ рдкрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдХреНрд╖рдорддрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред