======C/C++ Programming Journal======
====Week 1====
__August 26, 2014__
Syllabus day... :-/
__August 28, 2014__
Today we dove into writing our first simple, but extremely cool, program! This was a much needed change of pace after sitting through what seemed like endless "syllabus day" classes. Here is the source code!
#include
int main()
{
fprintf(stdout, "Hello, World!\n");
return(0);
}
After saving my newly written program it needed to be compiled with gcc!
lab46:~/src/cprog$ gcc -o hello hello.c
It works!
lab46:~/src/cprog$ ./hello
Hello, World!
lab46:~/src/cprog$
After getting my first C program compiled and tested I needed to push it to my bitbucket hosted mercurial repository. Myself and many other students soon discovered that doing so over https was not possible. Thanks to [[opus:fall2014:mgardne8|opus:fall2014:mgardne8]] I was able to push to my repository over ssh! The https issue has since been fixed and pushing over https works great!
lab46:~/src/cprog/repo$ hg push http://dshadeck@bitbucket.org/dshadeck/CSCS1320
pushing to http://dshadeck@bitbucket.org/dshadeck/CSCS1320
http authorization required for https://bitbucket.org/dshadeck/CSCS1320
realm: Bitbucket.org HTTP
user: dshadeck
password:
real URL is https://bitbucket.org/dshadeck/CSCS1320
searching for changes
no changes found
lab46:~/src/cprog/repo$
__August 31, 2014__
Discovered that submit is having an issue with the project names given in the assignment instructions.
lab46:~$ submit cprog intro http://lab46.corning-cc.edu/opus/fall2014/dshadeck/start
ERROR! Invalid project for cprog!
lab46:~$
An Email fix request has been sent to Matt!
====Week 2====
__September 2, 2014__
Today Matt implemented a new note showcasing system. An author, designer, and reviewer will be chosen at the end of every class to create a copy of the notes for that day.
Aside from the note taking system Matt also introduced a weekly bonus point system!
Today we will be looking at variables.
Constants and data types
ex: 73 (constant) integer
3.14 (constant)float
'c' Character '/n' is also a single char.
"Hello" array of chars (aka sting)
"Hello\0" \0 = null terminator
0xdeadbeef Memory addresses usually reped is hex (variable address)
Variables
to make a variable we decale a the type and the name
type name; (type name; name=0;
or
type name=0;
Int
char are data types as well
y=x+2; format that c likes. put the variable you are interested in on the left hand side.
star denotes pointer which is a memory variable. int *d; integer pointer much different than variable pointer
d is integer pointer f is a char pointer
int b=0x3D HEX, c= 073;OCTAL
in C pointers let us deal with memory addresses
using indirection
__September 4, 2014__
Var1.c
#include
int main()
{
int a=5;
int b=0x3D, c=073;
int *d;
char e, *f;
e = 'X';
d=&c;
f=&e;
printf("address of a is : %p\n",&a);
printf("address of b is : %p\n",&b);
printf("address of c is : %p\n",&c);
printf("address of d is : %p\n",&d);
printf("address of e is : %p\n",&e);
printf("address of f is : %p\n",&f);
printf("a contains: %d\n", a);
printf("b contains: %d\n", b);
printf("c contains: %d\n", c);
printf("d contains: %p\n", d);
printf("e contains: '%c'(%hhd)\n", e, e);
printf("f contains: %p\n", f);
printf("d dereferenced is: %d\n", *d);
printf("f dereferenced is: '%c'(%hhd)\n", *f, *f);
return (0);
}
If we look at the var1.c we notice that a, b, c, d, e, and f are all variables available in the main() code block. This is an example of variable scope. Anything that is declared outside of the main() code block would be called global or file scope. With in our main() code block we can also have sub-blocks of code. This is called sub-scope.
Below is a representation of global, block, and sub-scope.
/* Ex: Global Scope */
int c;
{
/*Ex: Block Scope */
int a;
{
/*Ex: Sub-Scope */
int b;
}
}
Declaration and initialization of variables can be done all in one or as two separate things.
* declaration: int a;
* initialization: a=5;
* both: int a=5;
This small piece of Var1.c is a good example of this!
int a=5;
int b=0x3D, c=073;
int *d;
char e, *f;
e = 'X';
d=&c;
f=&e;
Looking at line 4 & 5 in the above code also demonstrates the use pointers and characters.
Char e, *f; is the declaration
e = 'X'; is the initialization
***I'm going to need some help on the pointer portion of this :/***
***Pointers Cont.***
To Define a pointer variable proceed with its name in asterisk. I.E.\\
int *ptr; The '*' informs the compiler that we want a pointer variable to set aside said allotment
of bites in memory.
int j, k;
k = 2;
j = 7; <-- line 1
k = j; <-- line 2
In the above, the compiler interprets the j in line 1 as the address of the variable j (its lvalue) and creates code to copy the value 7 to that address. In line 2, however, the j is interpreted as its rvalue (since it is on the right hand side of the assignment operator '='). That is, here the j refers to the value stored at the memory location set aside for j, in this case 7. So, the 7 is copied to the address designated by the lvalue of k.\\
ptr + 1; would be a memory allocation of 4 decimal. using the unary ++ operator, either pre- or post-, increments the address it stores by the amount sizeof(type) where "type" is the type of the object pointed to. 4 for an integer\\
References for Chapter 1:
"The C Programming Language" 2nd Edition
B. Kernighan and D. Ritchie
Prentice Hall
ISBN 0-13-110362-8\\
**Format Specifiers**
"%p" substitutes a memory address.\\
We cannot know the actual address of variable as it changes everytime we run the program, so we reference the address of the variable.\\
a,b,c are integers\\
"%d" - a format specifier, "%d" is used for integers.\\
"%d" is for signed integers.\\
"%u" is for unsigned integers.\\
"%x/%X" hexidecimal values.
"%c" displays it as an ASCII character [[http://www.asciitable.com]]
American Standard Code for Information Interchange.\\
7-bit/8-bit ASCII
16-bit Unicode (first 8 bytes are ASCII)
other ones, IBM-EBCDIC
e = 'A';\\
same as:\\
e = 65;\\
4 bytes - integer\\
2 bytes - "%hd" - half signed int (cuts range and size in half)\\
1 byte - "%hdd" - half half signed int(cuts range and size in half, then cuts both in half again.)\\
All chars need to be placed in between single quotes as displayed above.
This is compiled with:
gcc var1.c -o var1
or
gcc -o var1 var1.c
as long as the source code file (var1.c)isn't directly after the -o flag.
program is run with:
./var1
====Week 3====
__September 9, 2014__
Int a; we can only put one int in that memory space.
the need to have multiple numbers is evident.
if we have multiple values we would have multiple variables at this point in time.
name variable names relevantly.
make them small and meaningful
something that defines the code.
example: 4 test scores in 7th grade math class
int a;
int b;
int c;
int d;
float avg;
(float) is a type cast. imposing rules on somthing.
====Week 4====
remember to upload notes from cscs1240 flash drive tomorrow.
====Week 5====
1 #include
2 int main()
3 {
4 printf("a char is %d bytes\n", sizeof(char));
5 printf("a short int is %d bytes\n", sizeof(short int));
6 printf("a int is %d bytes\n", sizeof(int));
7 printf("a long int is %d bytes\n", sizeof(long int));
8 printf("a long long int is %d bytes\n", sizeof(long long int));
9
10 return(0);
11 }
~
====Week 6====
atoi(3)
man 3 atio
====Week 7====
int main()
{
int i, quit=0;
int j;
SDL_Surface *screen;
SDL_Surface *box;
SDL_Surface *box2;
SDL_Surface *background;
SDL_Event event;
SDL_Rect offset;
SDL_Rect offset2;
SDL_Init(SDL_INIT_EVERYTHING);
screen=SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
box=IMG_Load("box.bmp");
box2=IMG_Load("box.bmp");
background=IMG_Load("background.bmp");
offset.x = 320;
offset.y = 240;
offset2.x = 0;
offset2.y = 0;
while(quit==0)
{
SDL_BlitSurface(background, NULL, screen, NULL);
if (SDL_PollEvent(&event))
{
if(event.type==SDL_KEYDOWN)
{
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
quit=1;
break;
case SDLK_RETURN:
offset.x=320;
offset.y=240;
offset.w=box->w;
offset.h=box->h;
break;
case SDLK_UP:
offset.y=offset.y-10;
break;
case SDLK_DOWN:
offset.y=offset.y+10;
break;
case SDLK_LEFT:
offset.x=offset.x-10;
break;
case SDLK_RIGHT:
offset.x=offset.x+10;
break;
}
}
else if(event.type == SDL_QUIT)
quit = 1;
}
if(offset2.x <= 0)
i=10;
else if(offset2.x >=640)
i=-10;
if(offset2.y<=0)
j=10;
else if(offset2.y>=480)
j=-10;
offset2.x +=i;
offset2.y +=j;
SDL_BlitSurface(box2,NULL,screen,&offset2);
SDL_BlitSurface(box,NULL,screen,&offset);
SDL_Flip(screen);
SDL_Delay(20);
}
return(0);
}
====Week 8====
POINTERS ARE JUST MEMORY ADRESSES!
int score [num];
the closer you are to memory management the more you can do.
in the long run the better you become at pointers the easier data structures will become!
an array is "homogeneous type"
struct is a heterogeneous type
arrays and structs are modifiers
structs can be considered programmable datatypes: we can sepcifiy what we want in it
struct node {
int value
struct node *next;
};
you can put an array inside of a struct
with a struct we use a data operator
data.value=12
when you see dots being used they are just nesting structs inside structs.
struct node *start;
start=(strict node *) malloc(sizeof(struct node));
start=(struct node *
if its not a pointer its a dot. if its not a dot is a structure pointer ->
a good example of this is when we started using sdl
start -> next = (struct node*) malloc (sizeof(structnode));
linked list
google SDL_surface struct
and you will find
loops
arrays
functions
structs all help control our sanity.
with object oriented programming
all a class is a struct with some extra capability
in c you cant but functions in structs but you can in classes
====Week 9====
Read, write, open close, and append are the five main ideas that come to mind when talking about files.
we can also create, remove/delete, and seek.
lab46:~/src/cprog$ ./filefun cat filefun.c
i just read a 'z'
i just read a ' '
i just read a 'i'
i just read a ' '
i just read a 'r'
i just read a 'u'
i just read a 'b'
i just read a ' '
i just read a 'h'
i just read a 'o'
i just read a 't'
i just read a 'o'
i just read a 'g'
i just read a 's'
i just read a ' '
i just read a 'o'
i just read a 'n'
i just read a ' '
i just read a 'm'
i just read a 'y'
i just read a ' '
i just read a 'f'
i just read a 'a'
i just read a 'c'
i just read a 'e'
i just read a ' '
i just read a 'w'
i just read a 'h'
i just read a 'e'
i just read a 'n'
i just read a ' '
i just read a 'i'
i just read a ' '
i just read a 'g'
i just read a 'e'
i just read a 't'
i just read a ' '
i just read a 's'
i just read a 't'
i just read a 'r'
i just read a 'e'
i just read a 's'
i just read a 's'
i just read a 'e'
i just read a 'd'
i just read a '.'
i just read a '
'
i just read a '
'
lab46:~/src/cprog$ cat filefun.c
#include
#include
int main()
{
char c;
int i;
int count=0;
FILE *fptr; //file describes some important info that allows us to interact with a file.
fptr=fopen("hotdog.txt","r"); //doulbe quotes are important because we are using a string
if(fptr==NULL) // if statment to determin if the file opens correctly
{
fprintf(stdout, "Error opening file!\n");
exit(1);
}
for(i=0;i<48;i++)
{
c=fgetc(fptr);
fprintf(stdout,"i just read a '%c'\n",c);
}
fclose(fptr); //closing our now open file
return(0);
}
lab46:~/src/cprog$
====Week 10====
"object oriented programming is only extra fluff to attempt to hide the code that has to be there out of your site" -Matt Haas
things to think about
polymorphism
inheritance
encapsulation
classes
objects
struct example
struct rectangle{
int length;
int width;
};
struct rectangle rect1;
rectl.legnth=10;
rect1.width=5;
class example
class rectangle{ //this whole thing is a class declaration
public: //means this is accessible outside of the class (can be used like a struct)
int area();
int perimeter(); //member functions
rectangle(); //constructor creating something upon immediate execution
rectangle(int,int);//parameter list... two args
private: //means
int length;
int width; //member variables
};
access control three levels:
public
protected
private
these come into play when viewing things from the prospective of a class
used to instruct what info is available outside of the class
when we create an object from a class its called "instantiation"
====Week 11====
make a header file
#ifndef
====Week 12====
====Week 13====
======UNIX/Linux Fundamentals Journal======
====Week 1====
__August 26, 2014__
Syllabus day...:-/
__August 28, 2014__
__The UNIX Philosophy__
- Small is beautiful.
- Do one thing, and do that one thing extreamly well.
- Everything is a file (almost)
__Three Types of Files__
- Regular/Ordinary
- Directory (Links)-Metadata
- Special
__Three Tiers of Ownership__
- User
- Group
- Other (world)
__August 31, 2014__
Discovered that submit is having an issue with the project names given in the assignment instructions.
lab46:~$ submit Unix intro http://lab46.corning-cc.edu/opus/fall2014/dshadeck/start
ERROR! Invalid project for Unix!
lab46:~$
An Email fix request has been sent to Matt!
====Week 2====
__September 2, 2014__
Matt implemented a new system of showcasing notes. Each class three students will be chosen for the roles of author, designer, and reviewer. This is a great way of making a organized set of well rounded class notes.
Everyone got to check out Alpine! This is the client used to check out our lab46 email accounts while logged into lab46.
Today we will be setting up our lab46 mercurial repos!
~ universal for home directory!
following the steps here was a great deal of help.
http://lab46.corning-cc.edu/haas/fall2014/common/repo
__September 4, 2014__
Unix file system starts at /
home is beneath /
dshadeck beneath /home
src is beneath that... soo it looks like this!
/home/dshadeck/src
devices such as flash drives etc show up in mnt.
We use to mount things by hand in unix/linux but now we have programs that do this for us.
/ is also a directory seperator
pwd at out home terminal shows the file path
/home/dshadeck
changing directory to our src directory and running pwd shows
cd
pwd
/home/dshadeck/src
relative path works off our current location.
absolute path references our entire path from the beginning of the file system
cd .. will take you back a directory.
cd will take you to your home directory
"<"redirects stdin from file
">" redirects stdout to file (writes)
">>" " " " " (appends)
"2>" redirects stderr to write
"2>>"
tail is useful to see log files in real time.
./myprog < input
this can be useful if you have created a program and need to test it with standard input.
/dev/null
basic commands for the files system are held in /bin
====Week 3====
__Status__
First, I would like to remind everybody of this useful command that is now available to us. lab46:~$ status unix this will display your progress on attendance, opus, and projects.
__Cal__
Next, we learned some interesting UNIX commands today. lab46:~$ cal This command has several arguments you can find some interesting things out with the day and the year. There is also another command lab46:~$ ncal (year) -e This tells you the date of Easter on the given year.
__Date__
Another command is lab46:~$ date This tells you the date. This command has several powerful arguments.
__Pom__
My personal favorite command we did was lab46:~$ pom This stands for phase of moon. It tells you the current state the moon in percentage.
__Write__
Finally, we learned a command to message other users. Cast a who to see whose on then do the following command. lab46:~$ write (user)
This will allow you to send a message to the user. \\
*You do not type your message until after you do the command.
__Man__
For more information on any commands, get to your shell and man them, man!^_^
lab46:~$ man (optional page number) command
__/__
We also went through the / directories to get a feeling of what goes where. There is a proc folder in / and it has all the current processes running manifested into directories. It also has cpu information. If your curious on what a t flag at the end of file permissions does, it prevents deletion. The var folder in / has a variety of stuff in this is also a log info.
__/usr__
The /usr/include folder has header files. The /usr/lib has more library's that applications use. The /usr/local has local modification. The /usr/sbin has secondary tools for the administrator, has daemons a.k.a. servers and manipulation tools. Look under /usr/share if you want to learn about some installed software. /usr/src is where some people put source code that runs on the system.
====Week 4====
__Archives__
After copying the archives to my home directory i extracted them
lab46:~/Documents$ tar -xvjf archive2.tar.bz2
image1.jpg
image2.gif
image3.png
image4.txt
lab46:~/Documents$
lab46:~/Documents$ unzip archive1.zip
Archive: archive1.zip
inflating: image1.jpg
extracting: image2.gif
inflating: image3.png
extracting: image4.txt
lab46:~/Documents$
After checking out the image files i determined that files image1 and image3 from archive1.zip and image2 and image4 from archive2.tar.bz2 were viewable/complete. I then arranged/named them according to the directions.
I then added the 4 files to a tar archive
lab46:~/Documents$ tar -cvf myarchive.tar small.txt smallest.jpg big.gif biggest.png
small.txt
smallest.jpg
big.gif
biggest.png
lab46:~/Documents$
Then i compressed the tar archive with gzip to the directions standards.
lab46:~/Documents$ gzip -n -8 myarchive.tar
lab46:~/Documents$
All done!
lab46:~/Documents$ submit unix archives myarchive.tar.gz
Submitting unix project "archives":
-> myarchive.tar.gz(OK)
SUCCESSFULLY SUBMITTED
lab46:~/Documents$
__Puzzle Box__
After copying file.txt to my home directory i check out the manual pages/help for file:
lab46:~$ file --help
Usage: file [OPTION...] [FILE...]
Determine type of FILEs.
--help display this help and exit
-v, --version output version information and exit
-m, --magic-file LIST use LIST as a colon-separated list of magic
number files
-z, --uncompress try to look inside compressed files
-b, --brief do not prepend filenames to output lines
-c, --checking-printout print the parsed form of the magic file, use in
conjunction with -m to debug a new magic file
before installing it
-e, --exclude TEST exclude TEST from the list of test to be
performed for file. Valid tests are:
apptype, ascii, cdf, compress, elf, encoding,
soft, tar, text, tokens
-f, --files-from FILE read the filenames to be examined from FILE
-F, --separator STRING use string as separator instead of `:'
-i, --mime output MIME type strings (--mime-type and
--mime-encoding)
--apple output the Apple CREATOR/TYPE
--mime-type output the MIME type
--mime-encoding output the MIME encoding
-k, --keep-going don't stop at the first match
-l, --list list magic strength
-L, --dereference follow symlinks (default if POSIXLY_CORRECT is set)
-h, --no-dereference don't follow symlinks (default if POSIXLY_CORRECT is not set)
-n, --no-buffer do not buffer output
-N, --no-pad do not pad output
-0, --print0 terminate filenames with ASCII NUL
-p, --preserve-date preserve access times on files
-r, --raw don't translate unprintable chars to \ooo
-s, --special-files treat special (block/char devices) files as
ordinary ones
-C, --compile compile file specified by -m
-d, --debug print debugging messages
Report bugs to http://bugs.gw.com/
lab46:~$
from this i determined that the three file commands i would need are:
lab46:~$ file file.txt
file.txt: ASCII text
lab46:~$ file -m file.txt
file.txt, 1: Warning: offset `This is a simple text file. It contains ASCII text.' invalid
file.txt, 1: Warning: type `This is a simple text file. It contains ASCII text.' invalid
file: could not find any valid magic files!
lab46:~$ file -i file.txt
file.txt: text/plain; charset=us-ascii
lab46:~$
We can see this is an ASCII text file:
lab46:~$ file file.txt
file.txt: ASCII text
lab46:~$ cat file.txt
This is a simple text file. It contains ASCII text.
lab46:~$
After compressing file.txt this was files output
lab46:~$ gzip file.txt
lab46:~$ file file.txt.gz
file.txt.gz: gzip compressed data, was "file.txt", last modified: Thu Sep 18 13:00:08 2014, from Unix
lab46:~$
After recompressing file.txt according to the directions i received this output from file:
lab46:~$ gzip -1 file.txt
lab46:~$ file file.txt.gz
file.txt.gz: gzip compressed data, was "file.txt", last modified: Thu Sep 18 13:00:08 2014, max speed, from Unix
lab46:~$
====Week 5====
Quotes
'-full quote, literal quote
"-half qoute, allow for expansion
`-back quote, backtick, command expansion
all upercase variables are environment variables
====Week 6====
Practicing commands today with wildcards. Went into usr/bin to count files :D
**Wildcards:**
^ Wildcard Char ^ Meaning ^
| ? | matches any single character |
| * | match 0 or more of any character |
| [] | match any one of enclosed characters |
| [%%^%%] | do not match any of enclosed chars |
====Week 7====
__Kill__
ls -l /bin/ls would make the program "ls" active.
a process is a program in action vs program inaction heh
once it is ran it is given a PID (process identification number) equates to a 16 bit value starting at 1
the max number of processes would be 65536 (2^16)
1 is reserved for the first process on the system (usually INIT)
ps is a tool to view processes...
lab46:~$ ps
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
dshadeck 18549 0.0 0.0 14220 1212 pts/20 Ss Sep25 0:00 /bin/bash
dshadeck 18552 0.0 0.3 120816 5192 pts/20 Sl+ Sep25 2:49 irssi
dshadeck 22927 0.0 0.1 14044 1952 pts/72 Ss+ 15:54 0:00 -bash
dshadeck 23596 0.0 0.1 14056 2072 pts/101 Ss 16:09 0:00 -bash
dshadeck 24146 0.0 0.0 11332 1076 pts/101 R+ 16:28 0:00 ps u
lab46:~$
to actually use the kill command we can launch cat -
this gives us a process to run and later kill
lab46:~$ ps
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
dshadeck 18549 0.0 0.0 14220 1212 pts/20 Ss Sep25 0:00 /bi
dshadeck 18552 0.0 0.3 120816 5192 pts/20 Sl+ Sep25 2:50 irs
dshadeck 22927 0.0 0.1 14044 1952 pts/72 Ss+ 15:54 0:00 -ba
dshadeck 23596 0.0 0.1 14060 2092 pts/101 Ss 16:09 0:00 -ba
dshadeck 24283 0.0 0.1 14052 2056 pts/118 Ss 16:34 0:00 -ba
dshadeck 24590 0.2 0.0 6424 348 pts/101 S+ 16:37 0:00 cat
dshadeck 24598 0.0 0.0 11332 1080 pts/118 R+ 16:37 0:00 ps
lab46:~$
we can see that cat is now running under PID 24590.
now to kill this process do:
lab46:~$ kill 24590
lab46:~$ ps
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
dshadeck 18549 0.0 0.0 14220 1212 pts/20 Ss Sep25 0:00 /bin/bash
dshadeck 18552 0.0 0.3 120816 5192 pts/20 Sl+ Sep25 2:50 irssi
dshadeck 22927 0.0 0.1 14044 1952 pts/72 Ss+ 15:54 0:00 -bash
dshadeck 23596 0.0 0.1 14060 2092 pts/101 Ss+ 16:09 0:00 -bash
dshadeck 24283 0.0 0.1 14052 2064 pts/118 Ss 16:34 0:00 -bash
dshadeck 24661 0.0 0.0 11332 1080 pts/118 R+ 16:39 0:00 ps u
lab46:~$
As we can see PID 24590 is no longer running.
kill PID will run the command with -15
Kill can end a process 64 ways. running the following displays them all:
lab46:~$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
lab46:~$
The nicest way to terminate a process is to use the hang up method also called SIGHUP.
you can do this by issuing:
lab46:~$ kill -1 PID
the next way is to issue a kill interrupt :
lab46:~$ kill -2 PID
To make learning about kill a little more interesting we copied cat to our home directories and renamed the command with a custom name.
mine was stuff:
lab46:~$ cp /bin/cat stuff
lab46:~$ ./stuff
you can see it running in ps with its custom name:
lab46:~$ ps
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
dshadeck 18549 0.0 0.0 14220 1212 pts/20 Ss Sep25 0:00 /bin/bash
dshadeck 18552 0.0 0.3 120816 5192 pts/20 Sl+ Sep25 2:50 irssi
dshadeck 22927 0.0 0.1 14044 1952 pts/72 Ss+ 15:54 0:00 -bash
dshadeck 23596 0.0 0.1 14060 2092 pts/101 Ss 16:09 0:00 -bash
dshadeck 24283 0.0 0.1 14056 2096 pts/118 Ss 16:34 0:00 -bash
dshadeck 24969 0.5 0.0 6424 348 pts/101 S+ 16:47 0:00 ./stuff
dshadeck 24971 0.0 0.0 11332 1080 pts/118 R+ 16:47 0:00 ps u
lab46:~$
A good order to try and terminate a process would be
kill -1
kill -15
kill -9
We can also use top to see a real time update stream of what processes are running on the system:
top - 16:57:43 up 12 days, 17:51, 48 users, load average: 0.56, 0.35, 0.25
Tasks: 397 total, 1 running, 391 sleeping, 5 stopped, 0 zombie
%Cpu(s): 1.7 us, 4.6 sy, 0.0 ni, 80.7 id, 0.0 wa, 0.2 hi, 0.3 si, 12.4 st
KiB Mem: 1535680 total, 1490940 used, 44740 free, 398044 buffers
KiB Swap: 131068 total, 37104 used, 93964 free. 524652 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28580 root 20 0 0 0 0 S 6.0 0.0 2:06.99 kworker/0:1
7 root 20 0 0 0 0 S 4.6 0.0 33:35.05 rcu_sched
26279 avolino 20 0 99900 2160 1032 S 3.0 0.1 0:00.27 sshd
23348 jhauck1 20 0 120780 5236 3164 S 2.0 0.3 2:35.68 irssi
24327 stiwari1 20 0 99900 2160 1028 S 1.7 0.1 0:00.13 sshd
26496 jcliteur 20 0 16044 1736 1052 S 1.7 0.1 0:00.16 top
12133 mp010784 20 0 45872 5804 1324 S 1.3 0.4 0:58.13 mosh-server
23012 mquesad1 20 0 100036 2164 1032 S 1.3 0.1 0:00.16 sshd
26236 acarson1 20 0 99900 2156 1028 S 1.0 0.1 0:00.16 sshd
26498 avolino 20 0 16044 1704 1052 S 1.0 0.1 0:00.14 top
26507 tmosgrov 20 0 16044 1720 1052 S 1.0 0.1 0:00.12 top
26512 acarson1 20 0 16044 1736 1052 S 1.0 0.1 0:00.07 top
26494 nvitull1 20 0 16044 1700 1052 S 0.7 0.1 0:00.18 top
26495 abuck4 20 0 16048 1744 1052 S 0.7 0.1 0:00.14 top
26499 mp010784 20 0 16212 1836 1084 S 0.7 0.1 0:00.14 top
26500 wedge 20 0 13992 1660 1000 S 0.7 0.1 0:00.15 top
26502 dshadeck 20 0 16160 1780 1060 R 0.7 0.1 0:00.15 top
26503 mquesad1 20 0 16044 1720 1052 S 0.7 0.1 0:00.14 top
26504 nsano 20 0 16044 1700 1052 S 0.7 0.1 0:00.08 top
26506 stiwari1 20 0 16044 1720 1052 S 0.7 0.1 0:00.20 top
9646 root 20 0 842960 2612 1568 S 0.3 0.2 1:44.81 nscd
18746 root 20 0 0 0 0 S 0.3 0.0 0:04.58 kworker/u4:1
23187 nsano 20 0 30984 4404 2152 S 0.3 0.3 0:00.36 vi
24255 vgarfiel 20 0 100036 2148 1020 S 0.3 0.1 0:00.52 sshd
24454 tmosgrov 20 0 99900 2152 1024 S 0.3 0.1 0:00.39 sshd
26493 jjacobs7 20 0 16044 1700 1052 S 0.3 0.1 0:00.22 top
26497 vgarfiel 20 0 16044 1700 1052 S 0.3 0.1 0:00.13 top
26501 ahoover3 20 0 16144 1760 1060 S 0.3 0.1 0:00.10 top
26505 ssmit133 20 0 16160 1768 1052 S 0.3 0.1 0:00.12 top
1 root 20 0 15452 36 8 S 0.0 0.0 0:23.28 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 24:33.08 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root rt 0 0 0 0 S 0.0 0.0 4:47.09 migration/0
10 root rt 0 0 0 0 S 0.0 0.0 2:27.01 watchdog/0
11 root rt 0 0 0 0 S 0.0 0.0 2:09.93 watchdog/1
12 root rt 0 0 0 0 S 0.0 0.0 4:23.34 migration/1
13 root 20 0 0 0 0 S 0.0 0.0 27:45.70 ksoftirqd/1
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
Issuing the command ps aux | grep $USER will allow us to what processes we are running on the system as well:
lab46:~$ ps aux | grep $USER
dshadeck 18548 0.0 0.1 66536 2680 ? Ss Sep25 0:01 SCREEN
dshadeck 18549 0.0 0.0 14220 1212 pts/20 Ss Sep25 0:00 /bin/bash
dshadeck 18552 0.0 0.3 120816 5192 pts/20 Sl+ Sep25 2:52 irssi
root 22924 0.0 0.2 99900 4508 ? Ss 15:54 0:00 sshd: dshadeck [priv]
dshadeck 22926 0.0 0.1 99900 2156 ? S 15:54 0:00 sshd: dshadeck@pts/72
dshadeck 22927 0.0 0.1 14044 1952 pts/72 Ss+ 15:54 0:00 -bash
root 24229 0.0 0.2 99900 4552 ? Ss 16:34 0:00 sshd: dshadeck [priv]
dshadeck 24282 0.0 0.1 100036 2144 ? R 16:34 0:01 sshd: dshadeck@pts/118
dshadeck 24283 0.0 0.1 14056 2100 pts/118 Ss 16:34 0:00 -bash
dshadeck 26605 0.0 0.0 11332 1064 pts/118 R+ 17:00 0:00 ps u aux
dshadeck 26606 0.0 0.0 15228 944 pts/118 S+ 17:00 0:00 grep dshadeck
lab46:~$
when using top you can customize they way it behaves by pressing ? and then h:
Help for Interactive Commands - procps-ng version 3.3.9
Window 1:Def: Cumulative mode Off. System: Delay 3.0 secs; Secure mode Off.
Z,B,E,e Global: 'Z' colors; 'B' bold; 'E'/'e' summary/task memory scale
l,t,m Toggle Summary: 'l' load avg; 't' task/cpu stats; 'm' memory info
0,1,2,3,I Toggle: '0' zeros; '1/2/3' cpus or numa node views; 'I' Irix mode
f,F,X Fields: 'f'/'F' add/remove/order/sort; 'X' increase fixed-width
L,&,<,> . Locate: 'L'/'&' find/again; Move sort column: '<'/'>' left/right
R,H,V,J . Toggle: 'R' Sort; 'H' Threads; 'V' Forest view; 'J' Num justify
c,i,S,j . Toggle: 'c' Cmd name/line; 'i' Idle; 'S' Time; 'j' Str justify
x,y . Toggle highlights: 'x' sort field; 'y' running tasks
z,b . Toggle: 'z' color/mono; 'b' bold/reverse (only if 'x' or 'y')
u,U,o,O . Filter by: 'u'/'U' effective/any user; 'o'/'O' other criteria
n,#,^O . Set: 'n'/'#' max tasks displayed; Show: Ctrl+'O' other filter(s)
C,... . Toggle scroll coordinates msg for: up,down,left,right,home,end
k,r Manipulate tasks: 'k' kill; 'r' renice
d or s Set update interval
W,Y Write configuration file 'W'; Inspect other output 'Y'
q Quit
( commands shown with '.' require a visible task display window )
Press 'h' or '?' for help with Windows,
Type 'q' or to continue
__Shells__
Traditional bash falls under sh- bourne shell (AT&T)(SYSTEMV)
bash- bourne again shell (ps -ef) (pg)
csh -c shell (BSD)(ps aux)(more)
a feature of bash is fg. We launched cat then stopped it and brought it back to the foreground:
lab46:~/src/cprog$ cat
^Z
[1]+ Stopped cat
lab46:~/src/cprog$ fg 1
cat
Naming a file with a leading . makes the file a hidden file. To see these files do:
lab46:~$ ls -a
. .exrc .pine-passfile.old .xsession-errors
.. .fontconfig .pinerc .xsession-errors.old
.ICEauthority .gconf .pinerc.old Desktop
.addressbook .gnome2 .pulse Documents
.adobe .gstreamer-0.10 .pulse-cookie Downloads
.alpine-smime .gtk-bookmarks .selected_editor Maildir
.bash_history .hgrc .signature Music
.bash_logout .imsettings.log .spice-vdagent Pictures
.bash_profile .indent.pro .ssh Public
.bashrc .irssi .swp Templates
.cache .lesshst .thumbnails Videos
.ccache .local .viminfo closet
.config .macromedia .vimrc mail
.dbus .mozilla .xinitrc public_html
.esd_auth .pine-passfile .xpaint src
lab46:~$
To create an alias(in this instance we made one called bob:
lab46:~$ alias bob='echo boo'
now when we run it:
lab46:~$ bob
boo
lab46:~
Editing PS1 can give you a custom terminal prompt:
lab46:~$ PS1='C:\w> '
C:~>
To change it back:
C:~> PS1='\h:\w\$ '
lab46:~$
h stands for hostname, w stands for working dir
the path variable is a modern day convenience:
lab46:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
lab46:~$ op=$PATH
lab46:~$ PATH=
lab46:~$ who
bash: who: No such file or directory
lab46:~$ ls
bash: ls: No such file or directory
lab46:~$ /bin/ls
Desktop Documents Downloads Maildir Music Pictures Public Templates Videos closet mail public_html src
lab46:~$ lab46:~$ echo $PATH
bash: lab46:~$: No such file or directory
lab46:~$ /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
bash: /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games: No such file or directory
lab46:~$ lab46:~$
bash: lab46:~$: No such file or directory
lab46:~$ PATH=$op
lab46:~$ ls
Desktop Documents Downloads Maildir Music Pictures Public Templates Videos closet mail public_html src
lab46:~$
__Shell Scripts__
Bash supports if statements and for loops! OMFG!!
include
#!/bin/bash for bash!
#!/bin/python for python!
A great example of shell scripting would be task5&6 from the dataproc assignment.
HighLVL
bash, vbs, python
java
C++
C
LowLVL
-gt greater than
-ge greater than or equal too
-lt lower than
-le lower than or equal too
-ne not equal
-eq equal
====Week 8====
we started today by running:
lab46:~/src/unix$ echo $RANDOM
2240
lab46:~/src/unix$ echo $RANDOM
10885
lab46:~/src/unix$ echo $RANDOM
8800
lab46:~/src/unix$ echo $RANDOM
23260
lab46:~/src/unix$ echo $RANDOM
17711
lab46:~/src/unix$
these numbers are "randomly generated" by an algorithm
If we wanted to expand our random number game script we could get the computer to pick the numbers for entry.
Modulus is fancy name for a remander
%=modulus
34%5=4
34/5=6
using modulus we can use $RANDOM to only generate numbers between 0-99:
lab46:~/src/unix$ echo $(($RANDOM%100))
95
lab46:~/src/unix$
by moddifying out command we can make the numbers generated fall between 1-100
lab46:~/src/unix$ echo $((($RANDOM%100)+1))
100
lab46:~/src/unix$
1 #!/bin/bash
2
3 choice=$((($RANDOM%100)+1))
4 guess=0
5 while [ "$guess" -lt 6 ];do
6 echo -n "Guess a number:"
7 read number
8 if [ "$number" -eq "$choice" ];then
9 echo "You are correct..."
10 exit 0
11 elif [ "$number" -lt "$choice" ];then
12 echo "Higher"
13 else
14 echo "Lower"
15 fi
16 let guess=$guess+1
17 done
18 exit 0
====Week 9====
ASSESSMENT :(
====Week 10====
regular expressions (regex)
. - match any single char
* - 0 or more of the previous
[] - char class match one or enclosed
[^] - do not match one of enclosed
\< - match start of word
\> - match end of word
^ - match start of line
$ - match end of line
| - or
( ) grouping \( sed \) - match one or more of the previous
to find all 4 char words in /usr/share/dict:
lab46:/usr/share/dict$ cat words | grep '^....$' | wc -l
3346
lab46:/usr/share/dict$
to find all 4 letter words that end in g:
lab46:/usr/share/dict$ cat words | grep '...g$' | wc -l
6999
lab46:/usr/share/dict$
to find all words 3 letters or more only containing lowercase letters:
lab46:/usr/share/dict$ cat words | grep '[a-z][a-z][a-z]' | wc -l
98182
to find words containing 3 or more lowercase vowels:
lab46:/usr/share/dict$ cat words | grep '.*[aeiouy].*[aeiouy].*[aeiouy]'| wc -l
64422
egrep=grep+moar
fgrep= fast grep, no regex
find words that end in "ed" "ing":
lab46:/usr/share/dict$ cat words | egrep '*(ed)$|(ing)$' | wc -l13412
lab46:/usr/share/dict$
====Week 11====
lab46:~$ date -d "$( stat output |grep "Modify" | sed 's/^Modify://g')" +%s
1415743490
lab46:~$ ftime=`date -d "$( stat output |grep "Modify" | sed 's/^Modify://g')" +%s`
lab46:~$ echo $ftime
1415743490
lab46:~$
mwhahaha
====Week 12====
Finding out how many users have never logged in:
lab46:~$ lastlog | grep 'Never' | wc -l
61
lab46:~$
====Week 13====