Pobieranie argumentów wiersza polecenia



Podobne dokumenty
Programowanie Proceduralne

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Wstęp do programowania 1

Sieciowa komunikacja procesów - XDR i RPC

Wprowadzenie do programowania i programowanie obiektowe

Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

4.2 Sposób korzystania z l acza

I - Microsoft Visual Studio C++

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

Co nie powinno być umieszczane w plikach nagłówkowych:

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);

Funkcje zawarte w bibliotece < io.h >

Funkcje zawarte w bibliotece < io.h >

Część 4 życie programu

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe.

Obsługa plików. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 25 września 2011

Uzupełnienie dot. przekazywania argumentów

Wstęp do programowania 1

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Krótkie wprowadzenie do korzystania z OpenSSL

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

Wstęp do Programowania, laboratorium 02

Podstawy Programowania. Tablice i wskaźniki cd., argumenty wywołania programu, reguły stylu programowania, asercje

Biblioteka standardowa - operacje wejścia/wyjścia

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3

Argumenty wywołania programu, operacje na plikach

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Wykład 1

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

Zdalne wywołania procedur. Jarosław Kuchta Programowanie Współbieżne

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

2 Przygotował: mgr inż. Maciej Lasota

Procesy. S. Samolej: Procesy

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19. Lab 9. Tablice liczbowe cd,. Operacje na tablicach o dwóch indeksach.

Operacje wejścia/wyjścia odsłona pierwsza

Funkcja (podprogram) void

Języki i metodyka programowania. Wprowadzenie do języka C

Functionalization. Jeszcze o funkcjach i strukturze projektu. Marcin Makowski. 3 grudnia Zak lad Chemii Teoretycznej UJ

Wskaźniki. Programowanie Proceduralne 1

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Wskaźniki. Informatyka

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Microsoft IT Academy kurs programowania

Obsługa plików Procesy

Informatyka. Wy-03 Dynamiczna alokacja pamięci, wyjątki. mgr inż. Krzysztof Kołodziejczyk

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Podstawy programowania skrót z wykładów:

Wskaźniki. Pamięć dynamiczna

1 Podstawy c++ w pigułce.

Temat zajęć: Obsługa procesów w systemie.

Czy procesor musi się grzać?

Gniazda BSD. komunikacja bezpołączeniowa

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie Proceduralne

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Programowanie strukturalne i obiektowe

1 Podstawy c++ w pigułce.

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

System operacyjny Linux

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Wprowadzenie do języka Java

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Podstawy programowania w języku C++

۰ Elementem jednostkowym takiego pliku jest bajt. ۰ Format pliku binarnego: [bajty pliku][eof]

Podstawy Kompilatorów

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Struktury. Przykład W8_1

Wstęp do programowania

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Pliki. Informacje ogólne. Obsługa plików w języku C

tablica: dane_liczbowe

Zadanie 04 Ktory z ponizszych typow danych w jezyku ANSI C jest typem zmiennoprzecinkowym pojedynczej precyzji?

Programowanie Procedurale. Pliki w języku C++

Wstęp. #define include include include include include include

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Poprzedni wykład [ ] :

Tworzenie aplikacji w języku Java

Transkrypt:

Pobieranie argumentów wiersza polecenia 2. Argumenty wiersza polecenia Lista argumentów Lista argumentów zawiera cały wiersz poleceń, łącznie z nazwą programu i wszystkimi dostarczonymi argumentami. Przykłady: $ cat plik $ ls l /tmp Standard ANSI definiuje dwa parametry, które można przekazywać funkcji main(): argc i argv. Pozwalają one przekazywać programom C/C++ argumenty z wiersza wywołania: nazwa programu test plik1 plik2 plik3 argumenty, które chcemy przekazać do programu Aby mieć dostęp do argumentów przekazywanych w wierszu wywołania program, nagłówek funkcji main() musi mieć postać: int main(int argc, char *argv[]) Parametr argc zawiera liczbę argumentów (ang. argument count) przekazywanych do programu. Jego wartość wynosi co najmniej 1, ponieważ nazwa programu jest również traktowana jako argument. Parametr argv (ang. argument value) to wskaźnik do tablicy wskaźników odsyłających do napisów będących argumentami z wiersza wywołania. Przykład: programu drukuje argumenty przekazane w wierszu wywołania int main(int argc, char *argv[]) { printf("wartosc argc to: %d\n", argc); printf("nazwa programu to: %s\n",argv[0]); printf("wartosci argumentow wiersza polecenia:\n"); { int i; for (i = 1; i < argc; i++) printf("arg %i to %s\n", i, argv[i]); return 0; Wywołanie programu: $./test 5 plik1 plik2 Wartosc argc to: 4 Nazwa programu to:./test Wartosci argumentow wiersza polecenia: arg 1 to 5 arg 2 to plik1 arg 3 to plik2 1

Można również wykorzystać fakt, że tablica z argumentami jest zakończona wskaźnikiem pustym: int main(int argc, char *argv[]) { printf("wartosc argc to: %d\n", argc); printf("nazwa programu to: %s\n",argv[0]); printf("wartosci argumentow wiersza polecenia:\n"); while (*++argv!= NULL) printf("argument: %s\n", *argv); return 0; 2

Opcje w wierszu polecenia Oczekiwane przez program argumenty można podzielić na dwie grupy: opcje oraz pozostałe argumenty. Krótkie opcje Przykłady: tar cvf archiwum.tar katalog-z-plikami lub tar c v -f archiwum.tar katalog-z-plikami ps fu nowak lub ps f u nowak Obsługa opcji #include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); extern int optind; /* wartość początkowa 1 */ extern char *optarg; extern optopt; extern opterr; /* wartość początkowa 1 */ Każde wywołanie funkcji getopt() obsługuje jedną opcję. Funkcja zwraca kod rozpoznanej opcji. Po zakończeniu opcji zwraca -1. W przypadku nierozpoznanej opcji zwraca znak zapytania (?). Jeśli argument optstring zaczyna się od dwukropka (:), funkcja zwraca :, jeśli po opcji wymagającej argumentu nie podano go. Argumenty: argc ile argumentów do analizy argv tablica z argumentami do analizy optstring jakie opcje (z ewentualnymi argumentami) są obsługiwane; jeśli opcja wymaga argumentu, po nazwie opcji należy umieścić dwukropek (:); kolejność umieszczania opcji nie ma znaczenia Zmienne związane z getopt: optint wskazuje następny element w tablicy argumentów wiersza polecenia; wartość początkowa wynosi 1; po zakończeniu przetwarzania opcji wskazuje pierwszy argument do dalszego przetwarzania optarg wskazuje argument związany z opcją, o ile opcja go wymaga optopt w przypadku nieznanej opcji getopt zwraca '?', optopt zawiera kod tej opcji; jeśli pominięto argument w opcji wymagającej argumentu, getopt zwraca ':', optopt zawiera kod tej opcji (tak dzieje się wtedy, jeśli optstring zaczyna się od : ) opterr jeśli 1 (prawda), getopt w przypadku nierozpoznanej opcji automatycznie wyświetla komunikat o błędzie na wyjściu stderr; jeśli 0 (fałsz) komunikat nie jest wyświetlany 3

Przykład: Załóżmy, że program można wywołać następująco: prog cvf dane.tar dane_kat #include <unistd.h> int main(int argc, char *argv[]) { int opcja; int kod_powrotu=0; char optstring[] = ":cvf:"; /* przetwarzane opcje */ while ( (opcja = getopt(argc,argv,optstring))!= -1 ) switch ( opcja ) { case 'c' : fprintf(stderr,"przetwarzam -c\n"); case 'v' : fprintf(stderr,"przetwarzam -v\n"); case 'f' : fprintf(stderr,"przetwarzam -f '%s'\n",optarg); case ':' : /* brakuje argumentu w opcji */ fprintf(stderr,"opcja -%c wymaga argumentu\n",optopt); kod_powrotu = 1; /* Wystapil blad */ case '?' : default : fprintf(stderr, "opcja -%c nie znana ignoruje\n", optopt); kod_powrotu = 1; /* Wystapil blad */ printf("pozostale argumenty:\n"); for ( ; optind < argc; ++optind ) printf("argv[%d] = '%s'\n",optind,argv[optind]); return kod_powrotu; 4

Opcje długie Opcje długie rozpoczynają się od znaków --. Przykład: ps --help ps -user nowak int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); int getopt_long_only(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); Przykład obsługi długich opcji: Mitchell, Oldham, Samuel, Linux. Programowanie dla zaawansowanych, str. 19. /*********************************************************************** * Code listing from "Advanced Linux Programming," by CodeSourcery LLC * * Copyright (C) 2001 by New Riders Publishing * * See COPYRIGHT for license information. * ***********************************************************************/ #include <getopt.h> #include <stdlib.h> /* The name of this program. */ const char* program_name; /* Prints usage information for this program to STREAM (typically stdout or stderr), and exit the program with EXIT_CODE. Does not return. */ void print_usage (FILE* stream, int exit_code) { fprintf (stream, "Usage: %s options [ inputfile... ]\n", program_name); fprintf (stream, " -h --help Display this usage information.\n" " -o --output filename Write output to file.\n" " -v --verbose Print verbose messages.\n"); exit (exit_code); 5

/* Main program entry point. ARGC conains number of argument list elements; ARGV is an array of pointers to them. */ int main (int argc, char* argv[]) { int next_option; /* A string listing valid short options letters. */ const char* const short_options = "ho:v"; /* An array describing valid long options. */ const struct option long_options[] = { { "help", 0, NULL, 'h', { "output", 1, NULL, 'o', { "verbose", 0, NULL, 'v', { NULL, 0, NULL, 0 /* Required at end of array. */ ; /* The name of the file to receive program output, or NULL for standard output. */ const char* output_filename = NULL; /* Whether to display verbose messages. */ int verbose = 0; /* Remember the name of the program, to incorporate in messages. The name is stored in argv[0]. */ program_name = argv[0]; do { next_option = getopt_long (argc, argv, short_options, long_options, NULL); switch (next_option) { case 'h': /* -h or --help */ /* User has requested usage information. Print it to standard output, and exit with exit code zero (normal termination). */ print_usage (stdout, 0); case 'o': /* -o or --output */ /* This option takes an argument, the name of the output file. */ output_filename = optarg; case 'v': /* -v or --verbose */ verbose = 1; case '?': /* The user specified an invalid option. */ /* Print usage information to standard error, and exit with exit code one (indicating abonormal termination). */ print_usage (stderr, 1); case -1: /* Done with options. */ default: /* Something else: unexpected. */ abort (); 6

while (next_option!= -1); /* Done with options. OPTIND points to first non-option argument. For demonstration purposes, print them if the verbose option was specified. */ if (verbose) { int i; for (i = optind; i < argc; ++i) printf ("Argument: %s\n", argv[i]); /* The main program goes here. */ return 0; Przykład użycia: $./program --help Usage:./program options [ inputfile... ] -h --help Display this usage information. -o --output filename Write output to file. -v --verbose Print verbose messages. 7