Programowanie współbieżne C na Linux – przykłady
Przykładowe zadania z programowania współbieżnego na systemie Linux Napisz program, który pokazuje, które atrybuty procesu macierzystego są dziedziczone przez proces potomny uruchomiony za pomocą funkcji fork(), które zaś otrzymują nową wartość. Napisz program, który pokazuje, które atrybuty procesu są zachowane przez proces po wykonaniu funkcji exec(). Napisz program, który wyświetla identyfikator procesu (PID) i nazwę

Przykładowe zadania z programowania współbieżnego na systemie Linux
- Napisz program, który pokazuje, które atrybuty procesu macierzystego są dziedziczone przez proces potomny uruchomiony za pomocą funkcji fork(), które zaś otrzymują nową wartość.
- Napisz program, który pokazuje, które atrybuty procesu są zachowane przez proces po wykonaniu funkcji exec().
- Napisz program, który wyświetla identyfikator procesu (PID) i nazwę związanego z nim polecenia dla wszystkich procesów uruchomionych przez użytkownika podanego w wierszu wywołania programu.
/** * Uzupełnij program shell z o „ręczną” obsługę potoków. * ---------------------------------------------------- * Napisz program, który zbiera komunikaty od wielu programów i wyświetla je na ekranie. Do komunikacji użyj potoku nazwanego. * * Wskazówka: Utwórz program rdfifo, którego zadaniem jest utworzenie kolejki FIFO i czytanie z niej danych. * Utwórz program wrfifo, który otwiera kolejkę FIFO tylko do zapisu i wpisuje do niej dane (np. swoj pid i czas). * * Q: W jaki sposób przekażesz wspólną nazwę kolejki FIFO do tych programów? * A: przez zmienną statyczą * * Q: W jaki sposób zapewnić działanie programu zbierającego komunikaty również wtedy, kiedy nie ma programu piszącego do łącza? * A: przez proces pętli nieskończonej ze sleep * * Q: Jak zapewnić to, że komunikaty pochodzące od różnych programów wyświetlane są w całości, tzn. nie są rozdzielane komunikatami od innych programów? * A: flush? (do sprawdzenia). * */
Wskazówka: informacje te można uzyskać przeglądając katalog /proc z plików (interesują nas katalogi, których właścicielem jest dany użytkownik) i pliki /proc/PID/status
Sources
- Compiler and enviroment – https://eclipse.org/cdt/downloads.php
- Eclipse Luna CDT http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.cdt.doc.user%2Fgetting_started%2Fcdt_w_install_cdt.htm
- Very goot tutorial for CPP http://www.learncpp.com/cpp-tutorial
- 5 Best Eclipse Plugins: #1 (Eclox with Doxygen, Graphviz and Mscgen) | MCU on Eclipse
C programing tutorial
Example solution 1 (draft)
[pastacode lang=”c” user=”karol-preiskorn” repos=”unx_sys_programming” path_id=”/README.md” revision=”master” highlight=”” lines=”” provider=”bitbucket”/] [pastacode lang=”c” user=”karol-preiskorn” repos=”unx_sys_programming” path_id=”/src/fifo_pipe.c” revision=”master” highlight=”1″ lines=”” provider=”bitbucket”/]Zrzut z działania
[pastacode lang=”c” user=”karol-preiskorn” repos=”unx_sys_programming” path_id=”/README.md” revision=”master” highlight=”” lines=”19-60″ provider=”bitbucket”/]Example solution 2 (draft)
[pastacode lang=”c” user=”karol-preiskorn” repos=”unx_sys_programming” path_id=”/src/fork_env_z1.c” revision=”master” highlight=”1″ lines=”” provider=”bitbucket”/]Using fork() in C/C++ – a minimum working example
In a C or C++ program, fork() can be used to create a new process, known as a child process. This child is initially a copy of the the parent, but can be used to run a different branch of the program or even execute a completely different program. After forking, child and parent processes run in parallel. Any variables local to the parent process will have been copied for the child process, so updating a variable in one process will not affect the other.
Consider the following example program:
[pastacode lang=”c” user=”karol-preiskorn” repos=”unx_sys_programming” path_id=”/src/example-1.c” revision=”master” highlight=”” lines=”” provider=”bitbucket”/]This program declares a counter variable, set to zero, before fork()ing. After the fork call, we have two processes running in parallel, both incrementing their own version of counter. Each process will run to completion and exit. Because the processes run in parallel, we have no way of knowing which will finish first. Running this program will print something similar to what is shown below, though results may vary from one run to the next.
--beginning of program parent process: counter=1 parent process: counter=2 parent process: counter=3 child process: counter=1 parent process: counter=4 child process: counter=2 parent process: counter=5 child process: counter=3 --end of program-- child process: counter=4 child process: counter=5 --end of program--