The Command Line,
the Environment, and Time
Chris Brown
In This Module
Accessing the command line
The environment
Processing command options
Time
Representations, conversions
Demonstrations
Time zone and locale
Process times
Command Line Arguments
$ dostuff apple orange banana Command
line
int main(char *argv[], argc)
dostuff\0
apple\0
argc
char **argv orange\0
banana\0
NULL
Traversing the Command Line
#include <stdio.h>
int main(int argc, char*argv[])
{
int i;
for (i=0; i< argc; i++)
printf("%s\n", argv[i]);
}
Usage Error Reporting
A program that expects
#include <stdio.h>
exactly one argument
#include <stdlib.h>
int main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "usage: %s file\n", argv[0]);
exit(1);
}
printf("processing %s\n", argv[1] );
}
Handling Command Options
tar c v b 200 f tar.out
\ foo bar
Boolean option
(verbose) Non-option
arguments
Numeric option Text option
(set block size) (output file name)
Combining Options
Equivalent
ls l -a commands ls la
tar cvf tar.out
\ foo bar
Boolean and text
options combined
Option Processing Using getopt()
getopt(argc, argv, optstring)
String specifying the allowed
As passed
option letters. A following ":"
Returns the to main()
says the option takes an argument
option letter
(or EOF if there As passed to main()
are no more) On completion, argv Example:
is re-ordered to put "abn:t:"
all the options first
The Environment
A list of strings carried by each process
HOME=/home/chris On the command line:
$ export FOO=BAR
Environment Variable $ env | grep FOO
(usually upper-case) FOO=BAR
The Environment
environ
HOME=/home/chris\0
SHELL=/bin/bash\0
TERM=xterm\0
FOO=BAR\0
NULL
Listing the Environment
#include <stdio.h>
extern char **environ;
void main(int argc, char *argv[])
{
char **p;
for (p=environ; *p != NULL; p++)
printf("%s\n", *p);
}
Querying the Environment
getenv(name)
The environment
variable's name
Returns the
associated string value
or NULL if none
Inheriting the Environment
The environment is normally
passed down from a process
to its children
and their children in turn
A process can choose not to
pass on its environment
Time
Representations of time
Conversions
Time zones and locales
Measuring process times
Time Conversions
fixed format string user formatted string,
Feb 28 19:31:34 2015 localised
asctime() strftime()
struct tm
(broken down time)
gmtime() localtime()
ctime() time_t
struct timeval
calendar time
time() gettimeofday()
Kernel
What Time Is It?
time(NULL) From the command line:
$ date +%s
1425812803
Returns the number of
seconds since "the epoch"
(Midnight, 1 Jan 1970, UTC) On a 32-bit system, a time_t
will overflow in January 2038
Broken Down Time
gmtime(t) Time returned in UTC
localtime(t) Time returned in local time zone
time_t
Returns the address
of a struct tm
("broken down" time)
The tm Structure
struct tm {
int tm_sec; /* seconds */
int tm_min; /* minutes */
int tm_hour; /* hours */
int tm_mday; /* day of the month */
int tm_mon; /* month */
int tm_year; /* year */
int tm_wday; /* day of the week */
int tm_yday; /* day in the year */
int tm_isdst; /* daylight saving time */
};
Demonstration
Recursive Directory Traversal
invoked by r option
Get "last modification" time of
each file
Break down into hours, minutes etc.
Histogram based on hour
Time Zones
Many time conversion routines
in glibc consult the
environment variable TZ
or failing that, use the file
/etc/localtime
TZ=":CET"
Timezone info stored in /usr/share/zoneinfo/CET
Time Conversions
fixed format string user formatted string,
Feb 28 19:31:34 2015 localised
asctime() strftime()
struct tm
(broken down time)
gmtime() localtime()
ctime() time_t
struct timeval
calendar time
time() gettimeofday()
Kernel
Converting to a Human-Readable Form
ctime(t)
time_t
Returns a printable string
in the local time zone
Feb 28 19:31:34 2015
We Don't All Speak the Same Language!
"Sunday 8 March"
"Sonntag 8 Mrz"
"Dimanche 8 Mars"
Locales
A locale defines conventions for displaying money amounts, times and dates
and numbers
- Defined by files under /usr/share/locale
May need to install additional languages, e.g. on Ubuntu:
- sudo apt-get install language-pack-de
Specify the locale by setting the environment variable LC_ALL
- LC_ALL=de_DE.utf8; export LC_ALL
Make the program aware of the locale:
- setlocale(LC_ALL, "")
Converting Time to a Locale-Specific String
strftime(buf, 1000, "%A %e %B", tm)
Format string. Codes include:
String returned %y 2-digit year Pointer to
in this buffer %Y 4-digit year struct tm
%R 24-hour time
%b Short month name
Size of buffer
%B Full month name
see man page for full list
Measuring Process Time
clock()
Returns a clock_t giving elapsed
process time in microseconds
Measuring Process Time
times(buf)
struct tms
Returns user time and system time for the
process and for its terminated children
The tms Structure
struct tms {
clock_t tms_utime; /* user time */
clock_t tms_stime; /* system time */
clock_t tms_cutime; /* user time of children */
clock_t tms_cstime; /* system time of children */
};
Kernel Space and User Space
Application Programs
sqrt() printf() write()
User
space
Standard
Library
The Linux Kernel Kernel
space
CPU Memory Disk Network
Module Summary
Command line arguments
Option processing with getopt()
The environment
Time
Representations (time_t, broken-down time)
Conversions
Printable representations, timezones, locales
Process times (system time and user time)
Coming up in the Next Module
Processes
Pipes