• 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

Object Storage Arubacloud
0 głosów
292 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,320 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,320 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ź 514 wizyt
0 głosów
1 odpowiedź 254 wizyt
pytanie zadane 22 listopada 2021 w Inne języki przez maxkolanko1998 Gaduła (3,230 p.)
0 głosów
1 odpowiedź 147 wizyt
pytanie zadane 13 października 2021 w Systemy operacyjne, programy przez poszukiwaczpomocy Nowicjusz (170 p.)

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...