Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*******************************************************************************************************
- Enunt prima problema:
- a) Ce header trebuie inclus pentru a folosi functia access?
- b) Scrieti o secventa de cod ce verifica daca procesul apelant are drept de citire din fisierul "/etc/passwd"
- NOTA: pastrati enuntul in acest comentariu si scrieti rezolvarea mai jos.
- *******************************************************************************************************/
- a) unistd.h
- b) const char * filename = "etc/passwd";
- result=access(filename, R_OK);
- if (result){
- return 1;
- }
- /****************************************************************************************
- Enunt a doua problema:
- Programul de mai jos contine trei erori sintactice (adica, detectabile la compilare), si ar trebui sa ofere
- urmatoarea functionalitate: Procesul principal creaza un fiu; Procesul fiu citeste doua numere
- le inmulteste si le returneaza folosind primitiva exit rezultatul inmultirii; Procesul parinte asteapta
- fiul sa termine si afiseaza rezultatul returnat;
- Corectati in programul de mai jos cele trei erori introduse voluntar in asa fel incat sa obtineti un program corect.
- Dupa linia pe care ati facut o corectie, includeti si o explicatie ca si comentariu pentru a obtine punctajul integral.
- NOTA: pastrati enuntul in acest comentariu si scrieti rezolvarea mai jos.
- ****************************************************************************************/
- #include <unistd.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h> //pt wait
- #include <sys/wait.h> //pt wait
- int main(int argc, char* argv[])
- {
- int pid1;
- pid1 = fork();
- if(pid1 == -1)
- {
- printf("Eroare la fork!");
- return -1;
- }
- if(pid1 != 0)
- {
- int status;
- waitpid(pid1, &status, 0);
- if(WIFEXITED(status))//era WFEXITED, lipsea un i
- {
- printf("Rezultatul este %d\n" , WEXITSTATUS(status) );//lipseau ghilimelele de la final
- }
- }
- else
- {
- int numar1, numar2, rezultat;
- scanf("%d", &numar1);
- scanf("%d", &numar2);
- rezultat = numar1 * numar2;
- exit(rezultat);
- }
- }
- /*******************************************************************************************************
- Enunt a treia problema:
- Sa se scrie un program C care va primi ca argument la linia de comanda o valoare numerica N,
- va citi N cuvinte de la tastatura si va calcula numarul de cuvinte din secventa citita
- ce au prima litera 'a' si ultima litera 'z', implementand urmatorii pasi:
- 1. procesul initial (P0) va crea un proces fiu P1 si ii va transmite toate cuvintele din secventa
- citita de la tastatura ce incep cu litera 'a'; cuvintele vor fi separate prin caracterul spatiu;
- transmiterea datelor se va realiza prin intermediul unui canal de comunicatie anonima;
- 2. procesul fiu P1 va crea la randul sau un nou proces fiu P2 si ii va transmite toate cuvintele
- din secventa primita de la procesul P0 care au ultima litera 'z'; cuvintele vor fi separate prin
- caracterul spatiu; transmiterea datelor se va realiza prin intermediul unui canal de comunicatie
- anonima;
- 3. procesul P2 va calcula numarul de cuvinte primite de la procesul P1 si ii va transmite
- procesului P1 valoarea calculata prin intermediul codului de retur (apel exit() sau instructiune
- return);
- 4. procesul P1 va transmite procesului P0 valoarea primita de la procesul P2 prin intermediul
- codului de retur (apel exit() sau instructiune return);
- 5. procesul P0 va afisa, la final, valoarea primita de la procesul P1.
- OBSERVATIE: Utilizarea de fisiere obisnuite in locul canalelor de comunicatie anonima
- va fi penalizata cu trei puncte.
- NOTA: pastrati enuntul in acest comentariu si scrieti rezolvarea mai jos.
- *******************************************************************************************************/
- #include <unistd.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <errno.h>
- #define NMAX 100
- int main (){
- /*declaratii*/
- int pid1, pid2;
- int pipe1[2], pipe2[2], pipe3[2];
- int n, i;
- char arr[NMAX];
- /*creare pipes*/
- if (pipe(pipe1)==-1){
- perror ("Eroare la crearea pipe 1!");
- exit(1);
- }
- if (pipe(pipe2)==-1){
- perror("Eroare la crearea pipe2!");
- exit(1);
- }
- if (pipe(pipe3)==-1){
- perror("Eroare la crearea pipe 3!");
- exit(1);
- }
- /*creare fork 1*/
- if ((pid1=fork())==-1){
- fprintf(stderr, "Eroare fork la fiul 1");
- exit(2);
- }
- /*work*/
- if (pid1!=0 && pid2!=0){ /* sunt in master */
- printf("Introduceti n: ");
- scanf("%d", &n);
- }
- else if (pid1==0){ /* sunt in fiu 1 */
- if ((pid2=fork())==-1){
- fprintf(stderr, "Eroare fork la fiul 2");
- exit(2);
- }
- return 1;
- }
- else if (pid2==0){ /* sunt in fiu 2 */
- return 1;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement