Блокировка iostream в std
От: Pavel515  
Дата: 09.02.17 13:11
Оценка:
Здраствуйте

Вот такая програмка

#include <fstream>
#include <iostream>
#include <string>

int main(int argc,char** argv){
    if(argc<2)return -1;
    std::ifstream ifs(argv[1]);
    std::string line;
    ifs.rdbuf()->lock();
    while(!std::getline(ifs,line).eof());
    ifs.rdbuf()->unlock();
    ifs.close();
    return 0;
}


В файлы
/usr/include/c++/4.1.2/fstream (для g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54) ) и
/usr/include/c++/4.4.7/fstream (для g++44 (GCC) 4.4.7 20120313 (Red Hat 4.4.7-1))

внес добавление (не спрашивайте зачем (ну наверное чтобы можно было блокировать операции с файлом на время работы программы))

filename: fstream 
.............................................

#include <sys/file.h>

  template<typename _CharT, typename _Traits>
    class basic_filebuf : public basic_streambuf<_CharT, _Traits>
    {
.............................................
      __filebuf_type*
      lock()
      {
        if(flock(_M_file.fd(),LOCK_EX)!=0)return NULL;//linux    
//        if(lockf(_M_file.fd(),F_LOCK,0)!=0)return NULL;//solaris
        return (this);
      }
      __filebuf_type*
      unlock()
      {
        if(flock(_M_file.fd(),LOCK_UN)!=0)return NULL;//linux
//        if(lockf(_M_file.fd(),F_ULOCK,0)!=0)return NULL;//solaris
        return (this);
      }
.............................................
*/


результат такой

[root@box test]# g++ read.cpp -o read
/tmp/ccE3GbC9.o: In function `main':
read.cpp.text+0xd5): undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::lock()'
read.cpp.text+0x116): undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::unlock()'
collect2: выполнение ld завершилось с кодом возврата 1
[root@box test]#

[root@box test]# g++44 read.cpp -o read
/tmp/cc8fjhmv.o: In function `main':
read.cpp.text+0x72): undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::lock()'
read.cpp.text+0xbf): undefined reference to `std::basic_filebuf<char, std::char_traits<char> >::unlock()'
collect2: выполнение ld завершилось с кодом возврата 1


насколько я понимаю файл fstream содержит в себе шаблон и препроцессор вставляет его в текст программы, а затем идет компиляция...
если изменить название функции, н-р на _lock() — то ошибка: неизвестная функция

[root@box test]# g++44 read.cpp -o read
read.cpp: In function ‘int main(int, char**)’:
read.cpp:9: ошибка: ‘struct std::basic_filebuf<char, std::char_traits<char> >’ has no member named ‘lock’
[root@box test]#

Система

[root@box test]# uname -a
Linux cdrbox 2.6.18-348.3.1.el5 #1 SMP Mon Mar 11 19:39:25 EDT 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@box test]# cat /etc/issue
CentOS release 5.9 (Final)
Kernel \r on an \m

Старенькая, но лучшее враг хорошего

P.S.


На прошлой неделе всё компилировалось
с тех пор поставил только libiconv-1.14 в /usr/local/lib64
Если хочешь выиграть в лотерею, то купи, хотя-бы лотерейный билет. (В.Мэгре)
Отредактировано 09.02.2017 13:21 Pavel515 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.