рдзрд╛рд░ рдлрд╝рд╛рдЗрд▓ред рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реИ?

рдкрд░рд┐рдЪрдп


рдЫрд╡рд┐
рд╢реБрдн рджреЛрдкрд╣рд░
рдореИрдВ рдХрдИ, рдПрдХ рдмрдбрд╝реЗ рдзрд╛рд░ рдЯреНрд░реИрдХрд░ - rutracker.org рдХреА рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░рддреА рд╣реИред
рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ ix *ред Rutracker.net , рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдпреЛрдЧреНрдп рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреЛ рдЕрдХреНрд╕рд░ (рдореЗрд░реЗ рд▓рд┐рдП - рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛) рддреНрд░реБрдЯрд┐рдпрд╛рдВ ( 502 рдЦрд░рд╛рдм рдЧреЗрдЯрд╡реЗ рдФрд░ 0 рдиреЛ рд░рд┐рд╕реНрдкреЙрдиреНрд╕ ) рдлреЗрдВрдХрддрд╛ рд╣реИред рдЯреЛрд░реЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ (рдореЗрд░реЗ рдкрд╛рд╕ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рд╣реИ) рдЯреЛрд░реЗрдВрдЯ рдХреЛ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдмреЗрд╢рдХ рдЬреЛ рдореБрдЭреЗ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рдЖрдк рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рдЯреНрд░реИрдХрд░ рдХреА рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдзрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдо ix * рдХреЛ рдкреЛрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рдзрд╛рд░ рдХреЛ рдмреНрд░реЛрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, n рдорд┐рдирдЯ / рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж рд╕реВрдЪреА рд╕реЗ рдЕрдЧрд▓рд╛ рдЯреНрд░реИрдХрд░ рдкреНрд░рджреВрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ - bt * .rutracker.org рдпрд╛ retracker.local , рдЬреЛ рдПрдХ рд╕рдлрд▓ рдХреЛрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдзрд╛рд░ рдлрд┐рд░ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдЧрдВрджрдЧреА рдореБрдЭрд╕реЗ рдмрд╣реБрдд рдЦреБрд╢ рдирд╣реАрдВ рд╣реИред

рд╕рдорд╛рдзрд╛рди рднреЛрдЬ рд╣реИ - рдЗрд╕ рдмреБрд░реЗ рдкрддреЗ рдХреЛ рд╕реВрдЪреА рд╕реЗ рд╣рдЯрд╛ рджреЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реА рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ, рдореИрдВ рд╣рд░ рдПрдХ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд╛рдЯрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛, рдФрд░ рдПрдХ рдирдИ рдзрд╛рд░ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдирд╣реАрдВ рдереАред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕рдордЭрдиреЗ рдФрд░ рд╕реВрдЪреА рд╕реЗ рдЯреНрд░реИрдХрд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

Bencode



рдпрд╣ рд╡рд╣ рдбреЗрдЯрд╛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк рд╣реИ рдЬрд┐рд╕реЗ .torrent рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд▓рдЧрднрдЧ рдХрд╣реАрдВ рднреА рдХрднреА рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ-рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рднреА рдЖрдпрд╛ рдерд╛ред
рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд░реНрддрдорд╛рди рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реА ++ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд╣рд╛рдВ, рд╣рд╛рдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдРрд╕реА рдХреЛрдИ рдЪреАрдЬ рд╣реИ , рд▓реЗрдХрд┐рди рдпрд╣ рд╢реБрджреНрдз рд╕реА рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рд╕реНрддреБрддрд┐ рдлреЙрд░реНрдо рдореБрдЭреЗ рд╕рдлрд▓ рдирд╣реАрдВ рд▓рдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреА рд╕рд░рд▓ рдмрд╛рдЗрдХ рд▓рд┐рдЦреА, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╛рд░реВрдк рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИред

4 рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ - рдмрд╛рдЗрдЯ рд╕рд░рдгреА, рд╕рдВрдЦреНрдпрд╛, рд╕реВрдЪреА, рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреАред

рдЖрдЗрдП рдЬрд╛рдиреЗ рдХреНрд░рдо рдореЗрдВ:


рд╡рд╣ рд╕рдм рд╣реИред рдлрд╝рд╛рдЗрд▓ рд╣реА рдРрд╕реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИред рдЗрд╕рд▓рд┐рдП, рдбреАрдХреЛрдбрд┐рдВрдЧ рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИ:
void CTorrentFile::ReadBencElement(ifstream & fin, tree <BencElement>::pre_order_iterator & parent, string name) { BencElement el; char c = fin.get(); el.name = name; if (c == 'i') { el.type = BencInteger; fin >> el.integer; m_tree.append_child(parent, el); } else if (c == 'l') { int l = fin.peek(); el.type = BencList; tree <BencElement>::pre_order_iterator it = m_tree.append_child(parent, el); while (l != 'e') { ReadBencElement(fin, it, string("")); l = fin.peek(); } fin.seekg(1, ios_base::cur); } else if (c == 'd') { int l = fin.peek(); el.type = BencDict; tree <BencElement>::pre_order_iterator it = m_tree.append_child(parent, el); while (l != 'e') { string name; int len; fin >> len; fin.seekg(1, ios_base::cur); while (len--) { char s = fin.get(); name += s; } ReadBencElement(fin, it, name); l = fin.peek(); } fin.seekg(1, ios_base::cur); } else if (c >= '0' && c <= '9') { fin.seekg(-1, ios_base::cur); int len; el.type = BencString; fin >> len; el.bstr.len = len; // skip ':' fin.seekg(1, ios_base::cur); el.bstr.byteStr = new char[len + 1]; for (int i = 0; i < len; i++) { char s = fin.get(); el.bstr.byteStr[i] = s; } el.bstr.byteStr[el.bstr.len] = 0; m_tree.append_child(parent, el); } } 


рдХреЛрдбрд┐рдВрдЧ рднреА рдЖрд╕рд╛рди рд╣реИ:
 void CTorrentFile::WriteBencElement(std::ofstream & fout, tree <BencElement>::sibling_iterator & el) { tree <BencElement>::sibling_iterator it; switch (el->type) { case BencInteger: fout << 'i' << el->integer << 'e'; break; case BencString: fout << el->bstr.len << ':'; fout.write(el->bstr.byteStr, el->bstr.len); break; case BencList: fout << 'l'; it = m_tree.child(el, 0); for (size_t i = 0; i < m_tree.number_of_children(el); i++, ++it) WriteBencElement(fout, it); fout << 'e'; break; case BencDict: fout << 'd'; tree <BencElement>::sibling_iterator it = m_tree.child(el, 0); for (size_t i = 0; i < m_tree.number_of_children(el); i++, ++it) { fout << it->name.length() << ':' << it->name.c_str(); WriteBencElement(fout, it); } fout << 'e'; break; } } 


.Torrent рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рдВрд░рдЪрдирд╛ред



рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдмреЗрдирдХреЛрдб рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдЬреЛрдбрд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрджрд┐ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдПрдХ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡ рдирд╛рдо, рдмрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝реАрд▓реНрдб), рддреЛ utf-8 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдордЧреНрд░реА рдПрдХ рдмрдбрд╝рд╛ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреА рд╣реИ:


рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдзрд╛рд░ рдореЗрдВ рдирд┐рд╣рд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рдПрдХрд▓ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рд╕рд░рдгреА рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЗрд╕ рд░реВрдк рдореЗрдВ, рдбреЗрдЯрд╛ рдмрд┐рдЯрдЯреЛрд░реЗрдВрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╣рдпреЛрдЧреА рд╕рд░рдгреА рдореЗрдВ рдирд┐рдореНрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:


рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдкреНрд░рд╛рд░реВрдк:


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕рдм рд╣реИред
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝реАрд▓реНрдб - рдШреЛрд╖рдгрд╛-рд╕реВрдЪреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рдЗрд╕ рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдкрд░ рд╣рдореЗрдВ рдЖрдкрддреНрддрд┐рдЬрдирдХ рдЯреНрд░реИрдХрд░ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 int CTorrentFile::RemoveTracker(const char * mask) { int deletedCount = 0; tree <BencElement>::pre_order_iterator root = m_tree.child(m_tree.begin(), 0); tree <BencElement>::sibling_iterator it = m_tree.child(root, 0); for (size_t i = 0; i < m_tree.number_of_children(root); i++, ++it) { if (it->type == BencString && !it->name.compare("announce") && it->bstr.len > 0 && it->bstr.byteStr) { if (wildcardMatch(it->bstr.byteStr, mask)) { it->bstr.len = 0; it->bstr.byteStr[0] = 0; deletedCount++; } } else if (it->type == BencList && !it->name.compare("announce-list")) { tree <BencElement>::sibling_iterator trackerList = m_tree.child(it, 0); for (size_t j = 0; j < it.number_of_children(); j++) { if (trackerList->type != BencList) { ++trackerList; continue; } tree <BencElement>::sibling_iterator tracker = m_tree.child(trackerList, 0); for (size_t k = 0; k < trackerList.number_of_children(); k++) { if (tracker->type != BencString || tracker->bstr.len <= 0 || !tracker->bstr.byteStr) { ++tracker; continue; } if (wildcardMatch(tracker->bstr.byteStr, mask)) { tracker = m_tree.erase(tracker); deletedCount++; } else ++tracker; } if (trackerList.number_of_children() == 0) trackerList = m_tree.erase(trackerList); else ++trackerList; } } } return deletedCount; } 


рд╣рдо рд╕рдм рдХреБрдЫ рдПрдХ рд╕реНрд░реЛрдд рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
рдбрд╛рдЙрдирд▓реЛрдб - рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо (рдЬреАрдд + * рдирд┐рдХреНрд╕), рдЖрдкрдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ :: рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо ред

рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди:
torrentEditor <file_name> <рдкреИрдЯрд░реНрди> , рдЬрд╣рд╛рдВ рдкреИрдЯрд░реНрди рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ ('*' рдФрд░ '?'), рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП - http: //ix*rutracker.net/*
рдпрджрд┐ рдЖрдк рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдирд╛рдо рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдФрд░ * .torrent рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╕рдВрд╢реЛрдзрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
<Name> .torrent рдХреЗ рд▓рд┐рдП рдмреИрдХрдЕрдк <name> .old рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред

Daemons рдФрд░ рдШрдбрд╝реА-рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ред



рдЗрд╕ рддрд░рд╣ рд╣рдо рдореМрдЬреВрджрд╛ .рдЯреЛрд░реЗрдВрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЯреНрд░реИрдХрд░ рдХреЛ рдХрд╛рдЯ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдирдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?
рдореИрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЪреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рд╡реЙрдЪ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реАред рд╣рдо .torrent рдХреЛ рд╡рд╣рд╛рдВ рдлреЗрдВрдХрддреЗ рд╣реИрдВ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрд╕реЗ рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╕реНрд╡рддрдГ рд╣реА рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЯреНрд░реИрдХрд░ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдХрд╛рдЯрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рджрд╛рдирд╡ рд▓рд┐рдЦрд╛ рдЬреЛ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдШрдбрд╝реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддрд╛ рд╣реИ, рдЯреНрд░реИрдХрд░ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЯреЛрд░реЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдШрдбрд╝реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдлреЗрдВрдХрддрд╛ рд╣реИред
рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдмрд┐рд▓реНрдХреБрд▓ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рдореИрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрд╕реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдзрд╛рд░ рдорд┐рд▓рддреА рд╣реИред

рд╣рдо рд╕реА рдореЗрдВ рдПрдХ рдЕрджреНрднреБрдд рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рджрд╛рдирд╡ рд▓рд┐рдЦрддреЗ рд╣реИрдВ - inotify ,
  notifyDesc = inotify_init(); if (notifyDesc < 0) exit(EXIT_FAILURE); watchDesc = inotify_add_watch(notifyDesc, argv[1], IN_CREATE); if (watchDesc < 0) exit(EXIT_FAILURE); // endless loop while (1) { processEvents(notifyDesc, argv[2], argv[3], argv[1]); } 


рд╣рдо inotify_init () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ inotify_add_watch () рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдЬреЛрдбрд╝реЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, IN_CREATE рдзреНрд╡рдЬ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдФрд░ рдлрд┐рд░ рд╣рдо рдЕрдВрддрд╣реАрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЯреНрд░реИрдХрд┐рдВрдЧ рдЪрдХреНрд░ рдХреЛ рд╕реНрдкрд┐рди рдХрд░рддреЗ рд╣реИрдВред
 static void processEvents(int wd, char * moveDir, char * pattern, char * watchDir) { #define BUF_SIZE ((sizeof(struct inotify_event) + FILENAME_MAX) * 10) int len, i = 0; char buf[BUF_SIZE]; // blocked read, we wake up when directory changed len = read(wd, buf, BUF_SIZE); while (i < len) { struct inotify_event * ev; ev = (struct inotify_event *)&buf[i]; processNewFile(ev->name, moveDir, pattern, watchDir); i += sizeof(struct inotify_event) + ev->len; } } 

рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реЛрдзрдХ рдХреЙрд▓ () рд╣рдо рдЙрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд▓реНрдж рд╣реА рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗ, рдЬреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╕рд░рдг рдХреА рдЬрд╛ рд░рд╣реА рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдлрд╝рд╛рдЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ - рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреА рдПрдХ рдЬреЛрдбрд╝реА () рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ () ред

рдбрд┐рдореЛрдиреЗрдЯрд╛рдЗрдЬреЗрд╢рди рднреА рдорд╛рдирдХ рд╣реИ:
  // create child-process pid = fork(); // error? if (pid < 0) exit(EXIT_FAILURE); // parent? if (pid > 0) exit(EXIT_SUCCESS); // new session for child sid = setsid(); if (sid < 0) exit(EXIT_FAILURE); // change current directory if (chdir("/") < 0) exit(EXIT_FAILURE); // close opened descriptors close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); 


рд╕реНрд░реЛрдд рдХреЛрдб

Source: https://habr.com/ru/post/In119753/


All Articles