Difference between revisions of "ProvaPratica 2009.02.12"
Jump to navigation
Jump to search
Stefano 92 (talk | contribs) |
m (Unite soluzioni di pagine differenti) |
||
Line 1: | Line 1: | ||
− | <h1>http://www.cs.unibo.it/~renzo/so/ | + | <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;
}
}
}
}