1// { dg-require-fork "" } 2// { dg-require-mkfifo "" } 3 4// Copyright (C) 2003 Free Software Foundation, Inc. 5// 6// This file is part of the GNU ISO C++ Library. This library is free 7// software; you can redistribute it and/or modify it under the 8// terms of the GNU General Public License as published by the 9// Free Software Foundation; either version 2, or (at your option) 10// any later version. 11 12// This library is distributed in the hope that it will be useful, 13// but WITHOUT ANY WARRANTY; without even the implied warranty of 14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15// GNU General Public License for more details. 16 17// You should have received a copy of the GNU General Public License along 18// with this library; see the file COPYING. If not, write to the Free 19// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 20// USA. 21 22// 27.8.1.4 Overridden virtual functions 23 24#include <unistd.h> 25#include <signal.h> 26#include <fcntl.h> 27#include <sys/types.h> 28#include <sys/stat.h> 29#include <fstream> 30#include <testsuite_hooks.h> 31 32// libstdc++/9533 33void test_01() 34{ 35 using namespace std; 36 using namespace __gnu_test; 37 bool test __attribute__((unused)) = true; 38 const char* name = "tmp_fifo1"; 39 40 const int count = 10000; 41 42 signal(SIGPIPE, SIG_IGN); 43 unlink(name); 44 45 if (0 != mkfifo(name, S_IRWXU)) 46 { 47 VERIFY( false ); 48 } 49 50 int fval = fork(); 51 if (fval == -1) 52 { 53 unlink(name); 54 VERIFY( false ); 55 } 56 else if (fval == 0) 57 { 58 filebuf ofbuf; 59 ofbuf.open(name, ios_base::in|ios_base::out); 60 VERIFY( ofbuf.is_open() ); 61 sleep(1); 62 63 for (int i = 0; i < count; ++i) 64 ofbuf.sputc(i % 100); 65 66 ofbuf.pubsync(); 67 sleep(1); 68 ofbuf.close(); 69 exit(0); 70 } 71 72 filebuf ifbuf; 73 ifbuf.open(name, ios_base::in); 74 VERIFY( ifbuf.is_open() ); 75 76 for (int j = 0; j < count; ++j) 77 { 78 filebuf::int_type c1 = ifbuf.sbumpc(); 79 VERIFY( c1 == j % 100 ); 80 } 81 82 filebuf::int_type c6 = ifbuf.sbumpc(); 83 VERIFY( c6 == filebuf::traits_type::eof() ); 84 85 sleep(2); 86 ifbuf.close(); 87 88 unlink(name); 89} 90 91int 92main() 93{ 94 test_01(); 95 return 0; 96} 97 98