Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witajcie,
mam mały problem. Na zajęcich pisałem sobie program w C na moim vps-ie(ubuntu). Wróciłem do domu(mam Arch-a) i chciałem go nieco rozbudować, niestety program nie działa... Wywala się albo podczas otwierania pliku do skopiowania albo podczas pliku do zapisu.
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <errno.h> #include <unistd.h> int main(int argc, char *argv[]) { int plik1, plik2; if ((plik1 = open(argv[1], O_RDONLY)) == -1) { fprintf(stderr, "Nie można otworzyć pliku do odczytu\n"); exit(1); } if ((plik2 = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC)) == -1) { fprintf(stderr, "Nie można otworzyć pliku do zapisu\n"); exit(1); } char buf[4096]; int r; while ((r = read(plik1, buf, 4096)) > 0) { write(plik2, buf, r); } if (r == -1) { fprintf(stderr, "Problem przy read."); return 0; } close(plik1); close(plik2); return 0; }
podczas kompilacji niby czysto
gcc -Wall -o binarka kod.c
./binarka ścieżka_pliku_do_skopiowania plik_docelowy
Offline
U mnie działa bez jęknięcia debian sid
Offline
Może coś z uprawnieniami
Offline
"Wywala się" to znaczy, że wyrzuca błąd na stderr, jeden z których tam zaimplementowałeś?
Offline
Zdefiniuj to "wywala się". Naruszanie obszaru pamięci? Wtedy końcówka "dmesg" oraz "ulimit -s" odpowiedzą na większość pytań. (bufor 4 KiB jest bardzo dużym, bo 8 KiB już może nie zadziałać - nie zmieści się na stosie zmiennych)
Skompiluj z opcję "-O2" <-- to badziewie włącza kilka dodatkowych mechanizmów bezpieczeństwa, np. dodatkowe warningi, bo -Wall to nie są wszystkie wbrew pozorom (naciąłem się na to ostatnio...)
Kilka uwag:
1. exity pozamieniaj na returny, bo tu nie trzeba exitów.
2. Przed każdym "exit" lub "return" zamknij ten wskaźnik do pliku, który otworzył się. Patrz fragment "(r == -1)" {tu swoją drogą chyba nie return 0, a np. -1 lub inna, ale zero to wyjście bez błędów; otwarte plik1 i plik2, bo czym wychodzisz nie zamykawszy ich} oraz "plik2 = open()" {otwarty plik1!}
3. To już luźna uwaga: czemu nie odpowiedniki tych funkcji zaczynające się na "f"? (fopen. fread, fwrite...)
4. Ostrożnie z polskimi literami w stringach! Mogą powodować problemy wszelkiej maści. Najlepiej ich unikać. (zresztą nawet nie wiadomo jakie kodowanie włączyć ma Filipińczyk, który odpalił to i zobaczył "coś" ;) )
5. He he... Wyprintfuj też co zwróci close(), bo może coś to podpowie, że z zamykaniem coś nie tak: http://linux.die.net/man/2/close
W przypadku błędów te funkcje wszystkie zdają się zwracać kod błędu w zmiennej superglobalnej "errno", warto ją printfować: http://linux.die.net/man/3/strerror
Offline
Dzięki NIC-u działa. Zrobiłem punkty 1, 2 i 4 i nagle cudownym sposobem ożyło.
Co do funkcji na "f" to nie używam ich bo w specyfikacji miałem dokładnie podane, że mam korzystać z funkcji systemowych. Zresztą sam przedmiot nazywa się "Programowanie na poziomie systemu operacyjnego" :)
A co do sterror to muszę się temu bliżej przyjżeć bo faktycznie przydatna funkcja.
Btw. dzięki też za tą flagę "-O2" do kompilacji. Na 100% się przyda.
Ostatnio edytowany przez Puchaty (2012-02-21 00:00:38)
Offline
Strony: 1