Difference between revisions of "ProvaPratica 2009.02.12"

From Sistemi Operativi
Jump to navigation Jump to search
m (Unite soluzioni di pagine differenti)
Line 1: Line 1:
<h1>http://www.cs.unibo.it/~renzo/so/compiti/2009-02-12.pdf</h1>
+
<h1>http://www.cs.unibo.it/~renzo/so/pratiche/2009.02.12.pdf</h1>
  
  
 
== Esercizio 1 ==
 
== Esercizio 1 ==
 
+
===Soluzione di Stefano92===
 +
<source lang="text">
 +
Scrivere un programma C denominato “invarg” che esegua il programma passato
 +
come parametro invertendo gli argomenti.
 +
Esempio:
 +
invarg cat a b c
 +
deve avere l'effetto di
 +
cat c b a
 +
</source>
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
 
#include <stdio.h>
 
#include <stdio.h>
Line 46: Line 54:
  
 
stefano92
 
stefano92
 +
==Esercizio 2==
 +
===Soluzione di Dado e Pierg===
 +
<source lang="text">
 +
Scrivere un programma in linguaggio C che crei due named pipe (passate per argomento), le apra in lettura e
 +
e copi in standard output i dati via via disponibili da ogni pipe.
 +
Test di funzionamento: aprire tre finestre di emulazione terminale. Nella prima lanciare: mergepipe p1 p2, nella seconda:
 +
cat >p1, nella terza cat>p2.
 +
Tutto cio' che scriverete o nella seconda o nella terza finestra deve comparire nella prima.
 +
</source>
 +
<source lang="c">
 +
#include <stdio.h>
 +
#include <stdlib.h>
 +
#include <poll.h>
 +
#include <sys/types.h>
 +
#include <sys/stat.h>
 +
#include <fcntl.h>
 +
 +
#define MAX 2048
 +
 +
int main (int argc, char *argv[]) {
 +
    if (argc < 3) {
 +
        perror("Argomenti sbagliati");
 +
    }
 +
    else {
 +
        struct pollfd pino [2];
 +
        nfds_t n = 2;
 +
        char buf[MAX];
 +
       
 +
        mkfifo(argv[1], 0666);
 +
        mkfifo(argv[2], 0666);
 +
        pino[0].fd = open(argv[1], O_RDONLY | O_NONBLOCK);
 +
        pino[1].fd = open(argv[2], O_RDONLY | O_NONBLOCK);
 +
        pino[0].events = POLLIN;
 +
        pino[1].events = POLLIN;
 +
       
 +
        while(1) {
 +
            int ret = poll(pino, n, 100);
 +
            if (ret == 1) {
 +
                if (pino[0].revents == POLLIN) {
 +
                    ssize_t x = read(pino[0].fd, buf, MAX);
 +
                    buf[x+1] = '\0';
 +
                    printf("%s", buf);
 +
                    pino[0].revents = 0;
 +
                }
 +
                else {
 +
                    ssize_t x = read(pino[1].fd, buf, MAX);
 +
                    buf[x+1] = '\0';
 +
                    printf("%s", buf);
 +
                    pino[1].revents = 0;
 +
                }
 +
            }
 +
            else if (ret == 2) {
 +
                ssize_t x = read(pino[0].fd, buf, MAX);
 +
                buf[x+1] = '\0';
 +
                printf("%s", buf);
 +
                pino[0].revents = 0;
 +
                x = read(pino[1].fd, buf, MAX);
 +
                buf[x+1] = '\0';
 +
                printf("%s", buf);
 +
                pino[1].revents = 0;
 +
            }
 +
        }
 +
    }
 +
}
 +
</source>

Revision as of 16:08, 6 May 2017

http://www.cs.unibo.it/~renzo/so/pratiche/2009.02.12.pdf


Esercizio 1

Soluzione di Stefano92

Scrivere un programma C denominato “invarg” che esegua il programma passato
come parametro invertendo gli argomenti.
Esempio:
invarg cat a b c
deve avere l'effetto di
cat c b a
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

void usage()
{
	printf("usage: ./invarg.out EXEC_NAME [ARG1] [ARG2] ... [ARGN]\n");
}

int main(int argc,char* argv[])
{
   char* tmp_i,*tmp_x;
   int x=(argc-1),i=2;
   if (argc<2)
   {
   		usage();
   		return(1);
   }
   while(i<x)
   {
       tmp_i=argv[i];
       tmp_x=argv[x];
       argv[i]=tmp_x;
       argv[x]=tmp_i;
       i++;
       x--;
   }
	for(i=0;i<argc-1;i++)
		argv[i]=argv[i+1];
	
	argv[argc-1]=NULL;
	argc--;
	execvp(argv[0],argv);
        //equivalentemente avrei potuto lanciare execvp(argv[1],argv+1) evitando di modificare argv[]
	return 0;

}

stefano92

Esercizio 2

Soluzione di Dado e Pierg

Scrivere un programma in linguaggio C che crei due named pipe (passate per argomento), le apra in lettura e
e copi in standard output i dati via via disponibili da ogni pipe.
Test di funzionamento: aprire tre finestre di emulazione terminale. Nella prima lanciare: mergepipe p1 p2, nella seconda:
cat >p1, nella terza cat>p2.
Tutto cio' che scriverete o nella seconda o nella terza finestra deve comparire nella prima.
#include <stdio.h>
#include <stdlib.h>
#include <poll.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define MAX 2048

int main (int argc, char *argv[]) {
    if (argc < 3) {
        perror("Argomenti sbagliati");
    }
    else {
        struct pollfd pino [2];
        nfds_t n = 2;
        char buf[MAX];
        
        mkfifo(argv[1], 0666);
        mkfifo(argv[2], 0666);
        pino[0].fd = open(argv[1], O_RDONLY | O_NONBLOCK);
        pino[1].fd = open(argv[2], O_RDONLY | O_NONBLOCK);
        pino[0].events = POLLIN;
        pino[1].events = POLLIN;
        
        while(1) {
            int ret = poll(pino, n, 100);
            if (ret == 1) {
                if (pino[0].revents == POLLIN) {
                    ssize_t x = read(pino[0].fd, buf, MAX);
                    buf[x+1] = '\0';
                    printf("%s", buf);
                    pino[0].revents = 0;
                }
                else {
                    ssize_t x = read(pino[1].fd, buf, MAX);
                    buf[x+1] = '\0';
                    printf("%s", buf);
                    pino[1].revents = 0;
                }
            }
            else if (ret == 2) {
                ssize_t x = read(pino[0].fd, buf, MAX);
                buf[x+1] = '\0';
                printf("%s", buf);
                pino[0].revents = 0;
                x = read(pino[1].fd, buf, MAX);
                buf[x+1] = '\0';
                printf("%s", buf);
                pino[1].revents = 0;
            }
        }
    }
}