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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2012-02-20 22:44:32

  Puchaty - Użytkownik

Puchaty
Użytkownik
Zarejestrowany: 2010-12-08
Serwis

Program w C na Ubuntu działa a na Archu już nie.

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.

Kod:

#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


But, I love GNU.
Debian User.

Offline

 

#2  2012-02-20 22:59:39

  hello_world - Członek DUG

hello_world
Członek DUG
Skąd: Rymanów Zdrój
Zarejestrowany: 2010-06-03
Serwis

Re: Program w C na Ubuntu działa a na Archu już nie.

U mnie działa bez jęknięcia debian sid

Offline

 

#3  2012-02-20 23:01:56

  Puchaty - Użytkownik

Puchaty
Użytkownik
Zarejestrowany: 2010-12-08
Serwis

Re: Program w C na Ubuntu działa a na Archu już nie.

No właśnie i tu jest problem. Może ktoś będzie miał jakiś pomysł co jest nie tak.


But, I love GNU.
Debian User.

Offline

 

#4  2012-02-20 23:03:59

  hello_world - Członek DUG

hello_world
Członek DUG
Skąd: Rymanów Zdrój
Zarejestrowany: 2010-06-03
Serwis

Re: Program w C na Ubuntu działa a na Archu już nie.

Może coś z uprawnieniami

Offline

 

#5  2012-02-20 23:09:47

  Puchaty - Użytkownik

Puchaty
Użytkownik
Zarejestrowany: 2010-12-08
Serwis

Re: Program w C na Ubuntu działa a na Archu już nie.

Też o tym myślałem i uprawnienia w katalogach nadrzędnych i samych plików są identyczne.


But, I love GNU.
Debian User.

Offline

 

#6  2012-02-20 23:24:51

  panjandrum - Użytkownik

panjandrum
Użytkownik
Skąd: Lublin/Kraków
Zarejestrowany: 2009-03-20

Re: Program w C na Ubuntu działa a na Archu już nie.

"Wywala się" to znaczy, że wyrzuca błąd na stderr, jeden z których tam zaimplementowałeś?


[url=https://github.com/panjandrum/obshutdown]obshutdown[/url] - Opedbox shutdown dialog

Offline

 

#7  2012-02-20 23:28:42

  NIC - Członek DUG

NIC
Członek DUG
Skąd: Wrocław
Zarejestrowany: 2006-12-25
Serwis

Re: Program w C na Ubuntu działa a na Archu już nie.

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


Stronka-dom: [url]http://titek.victorygames.pl[/url]
Jabber: nic@jabster.pl
Hobby: kompilowanie Linuksa, Bluetooth
Dystrybucja: żadna, bliski krewny LFS, składak

Offline

 

#8  2012-02-20 23:59:37

  Puchaty - Użytkownik

Puchaty
Użytkownik
Zarejestrowany: 2010-12-08
Serwis

Re: Program w C na Ubuntu działa a na Archu już nie.

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)


But, I love GNU.
Debian User.

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)

[ Generated in 0.008 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00010 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00119 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.188.132.71' WHERE u.id=1
0.00069 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.188.132.71', 1732364574)
0.00042 SELECT * FROM punbb_online WHERE logged<1732364274
0.00051 SELECT topic_id FROM punbb_posts WHERE id=195332
0.00061 SELECT id FROM punbb_posts WHERE topic_id=20726 ORDER BY posted
0.00064 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.00079 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.00078 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=20726
Total query time: 0.00582 s