• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Jak napisać własny wirtalny terminal

Hosting forpsi easy 1 pln
0 głosów
263 wizyt
pytanie zadane 21 lipca 2020 w C i C++ przez Cixo Gaduła (4,070 p.)
zamknięte 22 lipca 2020 przez Cixo
Hejka!

Chcę napisać program w rodzaju xterm, nie po to by coś z nim zrobić, tylko po to żeby się uczyć, więc nie piszcie że to nie ma sensu.

Wiem jak pobrać dane z klawiatury, jak wyświetlic dane w okienku, ale nie wiem:

1)skąd pobrać dane generowane przez programy?

2)jak przeslać do programu dane z klawiatury (np takiego napisanego w c++, gdzie jest cin, jak do tego cin coś przesłać?)
komentarz zamknięcia: Rozwiązano

1 odpowiedź

0 głosów
odpowiedź 21 lipca 2020 przez Oscar Nałogowiec (29,130 p.)
wybrane 22 lipca 2020 przez Cixo
 
Najlepsza
Uruchomienie innego programu z dwukierunkową komunikacją pomiędzy programem 'rodzicem' a 'dzieckiem' jest trochę skomplikowane, wymaga szeregu dziwnych operacji na deskryptorach. Korzysta się z faktu, że po wykonaniu fork() proces potomny dziedziczy wszystkie otwarte deskryptory od programu wywołującego.

Trzeba stworzyć dwie lub trzy (gdy też kontrolujemy stderr) rury (pipe2()) i trochę się pobawić dup2().

stdin to deskryptor numer 0, stdout 1 a stderr 2.

Jednokierunkowy odpowiednik jest gotowy w bibliotece C i nazywa się popen(). Umożlwia przejęcie wejścia albo wyjscia programu.
komentarz 22 lipca 2020 przez Cixo Gaduła (4,070 p.)
Dzięki, wygląda że o to mi chodzilo, jak coś to będę pisac.
komentarz 22 lipca 2020 przez Cixo Gaduła (4,070 p.)

Hejka mam takie pytanko, mianowicie:

Jak przesuwam STDOUD do pliku to w pliku sie wszystko pojawia bez opuznien, ale w momencie jak podmieniam na plik STDIN, to kiedy uruchomie program z tak przekierowanym na plik STDIN, ktury w petli wypisuje to co sie pojawia w cin, to wypisuje on to co bylo w pliku w momencie uruchomienia, a potem, kiedy w trakcje jego dzialania dopisze cos poleceniem echo do pliku ktury robi za STDIN to w programie-petli sie nic nie dzieje, ale kiedy go zatrzymam,i urucomie ponownie to dane jakie zapisalem tym echo sa wczytywane.

Czemu tak sie dzieje, i jak moge to naprawic?

Kod programu - petli wyglada tak:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <iostream>
#include <string>

using namespace std;

int main(){

	int closeFd;
	//;
	dup2(closeFd = open("output", O_RDWR), 0);
	//close(closeFd);
	
	while(true){
	
		string zmienna;
		cin >> zmienna;
		cout << zmienna;
	
	}
 close(closeFd);


}

PS: wiem ze to z czapy i nic nie robi, ale prubuje poprostu sprawidzc jak to trzeba zrobic jak najszybciej

komentarz 22 lipca 2020 przez Oscar Nałogowiec (29,130 p.)
Jeśli zdążyłbyś dopisać coś do pliku zanim program natrafi na koniec to pewnie wczytałby też to co zostało dopisane. Czytanie z pliku tym się różni od czytania z konsoli, potoku, seriala albo połączenia tcp, że w pliku na końcu "występuje" EOF.

Ostatnio właśnie miałem taki problem by obrabiać plik z miarę jak on rośnie (co prawda w Javie, ale to jest tutaj nieistotne) i po prostu sprawdzałem ile jeszcze pliku jest niewczytane (w Javie jest metoda available()) i jak było za mało to czekam aż wzrośnie. Przypuszczam, że biblioteki C/Javy mogą robić problem jak jednak sprobuje się wczytać ten "EOF" - wtedy ustawiają znacznik błędu, a on sam nie zniknie po powiększeniu pliku.

Problem powiększającego się pliku na poziomie shella rozwiązuje polecenie "tail -f" - wypisuje ono stopniowo nową zawartość pliku. Można sprawdzić jak tail to robi, albo wykorzystać właśnie to polecenie jako generator wejścia do własnego programu "tail -f rosnacy_plik | program".
komentarz 22 lipca 2020 przez Cixo Gaduła (4,070 p.)

Popatrzyłem na to ponownie, i stwierdziłem że użyje pipe, ale mam z tym problem, napisałem taki kod:

#include <sys/wait.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <fcntl.h>

using namespace std;

int main(){
    
    	int pipefd[2];
    
    	if(pipe(pipefd) == -1) cout<<"BLAD";
    	    
	pid_t pid = fork();
	
	if(pid == 0){
	
		//rodzic
		dup2(open("output", O_WRONLY), 1);
		wait(NULL);
		cout<<pipefd[1];
	
	}else{
	
		//dziecko
		dup2(pipefd[1], 1);
		cout<<"ok";
	
	}
    
}

Ma się tam wydarzyć:

stworzenie pipe,

dziecko pisze "ok" do pipe

dziecko kończy

rodzic przechwytuje pipe i pisze do pliku "output"

ALE:

po wykonaniu w pliku output mam tylko "4", nie wiem czemu.

Dzięku za każdą pomoc!

komentarz 22 lipca 2020 przez Cixo Gaduła (4,070 p.)

Coś mam, mega nadmiarowe, puki co komendy to są wpisane w program, ale działa, 

#include <unistd.h>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cstring>
#include <errno.h>
#include <sys/types.h>
#include <sys/time.h>
#include <cmath>
#include <sys/select.h>
#include <termios.h>
//#include <stropts.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <iostream>
#include <fcntl.h>

using namespace std;

int main(){

	int pipeSf[2], status, done=0;
	pipe(pipeSf);
	
	pid_t cpid;
	
	cpid = fork();
	
	if(cpid == 0){
	
		dup2(pipeSf[1], STDOUT_FILENO);
		execlp("./pisz.out", "./pisz.out", (char *) NULL);
	
	}
	
	cpid = fork();
	
	if(cpid == 0){
	
		close(pipeSf[1]);
		dup2(pipeSf[0], STDIN_FILENO);
		dup2(open("output", O_WRONLY), 1);
		execlp("./petla.out", "./petla.out", (char *) NULL);
	
	}
	
	close(pipeSf[1]);
	close(pipeSf[0]);
	
	waitpid(-1,&status, 0);
	waitpid(-1,&status, 0);

}

cout w apce jeden wpisuje do apki2, a wyjscie apki2 leci do pliku output

Dzięki za każdą pomoc, i temat do zamknięcia

Podobne pytania

0 głosów
1 odpowiedź 373 wizyt
0 głosów
1 odpowiedź 181 wizyt
pytanie zadane 22 listopada 2021 w Inne języki przez maxkolanko1998 Gaduła (3,210 p.)
0 głosów
1 odpowiedź 133 wizyt
pytanie zadane 13 października 2021 w Systemy operacyjne, programy przez poszukiwaczpomocy Nowicjusz (170 p.)

92,125 zapytań

140,785 odpowiedzi

317,804 komentarzy

61,446 pasjonatów

Advent of Code 2023

Top 15 użytkowników

  1. 1468p. - Łukasz Eckert
  2. 1444p. - Dawid128
  3. 1430p. - CC PL
  4. 1419p. - rafalszastok
  5. 1418p. - Marcin Putra
  6. 1373p. - Mikbac
  7. 1362p. - rucin93
  8. 1351p. - sefirek
  9. 1296p. - Adrian Wieprzkowicz
  10. 1267p. - Eryk Andrzejewski
  11. 1260p. - TheLukaszNs
  12. 1239p. - JarekDev
  13. 1234p. - Michal Drewniak
  14. 1188p. - Rafał Trójniak
  15. 1179p. - 13NOONE37
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Uwaga - w dniach od 02.12 do 08.12 trwają Mikołajki (książki drukowane mają rabat -35%, ebooki do -45%). Zaś dodatkowy, specjalny kod zniżkowy: HELMIKOLAJ-10 dla naszych Widzów zapewni Wam oszczędność -10zł dla zamówień powyżej 70zł! Warto korzystać!

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...