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
Time (s) | Query |
---|---|
0.00011 | SET CHARSET latin2 |
0.00005 | SET NAMES latin2 |
0.00097 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.116.14.12' WHERE u.id=1 |
0.00065 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.116.14.12', 1732375262) |
0.00040 | SELECT * FROM punbb_online WHERE logged<1732374962 |
0.00079 | DELETE FROM punbb_online WHERE ident='18.222.20.250' |
0.00081 | DELETE FROM punbb_online WHERE ident='3.135.247.17' |
0.00072 | SELECT topic_id FROM punbb_posts WHERE id=195321 |
0.00006 | SELECT id FROM punbb_posts WHERE topic_id=20726 ORDER BY posted |
0.00056 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=20726 AND t.moved_to IS NULL |
0.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00107 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=20726 ORDER BY p.id LIMIT 0,25 |
0.00086 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=20726 |
Total query time: 0.0071 s |