Operating systems 1 -- 2009-2010 -- info.uvt.ro/Laboratory 2

From Wikiversity

Quick links:

Source code management[edit]

Quick startup[edit]

# create a folder to hold all projects
mkdir ./workbench
# and go there
cd ./workbench

# checkout the example source code
svn checkout svn://hephaistos.info.uvt.ro/info/2009-2010/operating-systems-1/examples/laboratory-1/example-1
## the username is `guest` and the password `guest`

# modify the source code
nano ./main.c

# commit the modified files to the server
svn commit
## the `guest` user cannot commit changes

# synchronize the source code with the one on the server
svn update


Please consult the dedicated page.

Single-file C program[edit]

Please consult the contents of examples/laboratory-1/example-1 on SVN.

Manual building[edit]

gcc -o ./calc ./main.c

Automated building (with a Bash script)[edit]

  • the script content:

gcc -o ./calc ./main.c
  • invoking the script:
chmod +x ./build.sh

Automated building (with a Make script)[edit]

  • the makefile content:
default : ./calc

./calc : ./main.c
        gcc -o ./calc ./main.c
  • invoking make:

Multi-file C program[edit]

Please consult the contents of examples/laboratory-1/example-2 on SVN.

Automated building[edit]

  • the makefile content:
default : ./calc

./calc : ./main.o ./add.o ./substract.o ./usage.o ./parsing.o
        gcc -o ./calc ./main.o ./add.o ./substract.o ./usage.o ./parsing.o

./main.o : ./add.h ./substract.h ./usage.h

./add.o : ./add.h ./parsing.h ./usage.h

./substract.o : ./substract.h ./parsing.h ./usage.h

./parsing.o : ./parsing.h ./usage.h

./usage.o : ./usage.h

%.o : %.c
        gcc -c -o $@ $<



./fsq access <path> f|r|w|x
./fsq link <source> <target>
./fsq unlink <path>
./fsq mkdir <path>
./fsq rmdir <path>
./fsq rename <old> <new>
./fsq stat <path>
./fsq ls <path>


Implement a simple file system query utility that wraps some basic POSIX system calls:


  • you should have a makefile, that builds an executable named fsq in the current directory (as the default target);
  • each command (like the ones below) should be in it's own .c file;
  • include at least three different test-cases for each command in the makefile (except for stat and ls);
  • each command should either have the exit code 0 in case of success, or the errno value of the last executed system call;
  • each command should thoroughly check the arguments and system call usage; for example:
    • if the source or destination file exist or not (using access system call);
    • in case of link and unlink, if the source is truly a file (using stat system call);
    • (the same in the case of rmdir);


Output for ./fsq stat /tmp: for each file display:

  • entity type: file, folder, or other;
  • UID and GID;
  • entity permissions (mode);
  • size (in bytes);
type: folder
uid: 0
gid: 0
mode: 1777
size: 180

Output for ./fsq ls /etc (each entity name on a separate line):



For this you could start from the contents of examples/laboratory-1/example-4 on SVN.


Please consult the dedicated page -- Linux/UNIX programming (C/C++).

Ciprian Dorin Crăciun, ccraciun@info.uvt.ro