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ś?


obshutdown - 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: http://titek.victorygames.pl
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
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)