This blog will be describing step by step of what exactly happens when we type
ls -l *.c and hit Enter in a shell.
What is a shell?
Is a program in which we interact by the terminal that takes commands and gives them to the operating system to execute, basically it communicates with the computer mind.
What is a terminal?
Also called terminal emulator, provides as a way to open a window in which we can interact with the shell, where we can actually write the commands we want to execute.
What is a command?
Is an utility of the linux operating system (case sensitive) with which we give an instruction to the computer to do something we want the computer to do.
Step by step of ‘ls-l’ and ‘Enter’:
“ls” = short name of “list”
- Shell prints prompt ‘$’ in which after that we will write our command ‘ls-l’.
- The shell will read it from the getline function parsing the command line into arguments to the executing program.
- Will be checked if the command ‘ls’ is a built-in.
- The environment is copied and passed to the new process, here the shell will search in the PATH every time a command is entered.
- A program file called ‘ls’ will be searched by the shell in the PATH, then will be find in the /bin directory where the ‘ls’ executable file will be.
What is -l?
The flag -l will include more information in the result and change the format of what is returned by organizing it as a vertical list.
What is a flag?
Flags are a way to set options and pass in arguments to the commands you run, changing their behavior based on what flags are set.
What is *.c?
The wildcard *.c will match every file ending with .c in the current directory. Knowing this, we now know that ‘ls -l *.c’ will list a vertical detailed list from the current working directory with all the files ending in .c
=> fork + wait + execve
- To run a command the system call fork is made to duplicate the shell parent process (creating a child process).
- The system call execve: Stops duplicated process, loads the new program (ls), and starts it.
- We use the system call wait to suspend the execution of the parent process until the child process terminates, in other words it suspends the shell prompt until the ls command finishes executing.
- After ‘ls-l’ is executed, the shell frees up memory, exits, and comes back to the prompt where the user can type in the input.