C/Visual C - Ejercicio duda procesos hijos

 
Vista:
Imágen de perfil de Miguel Ángel
Val: 2
Ha aumentado su posición en 24 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Ejercicio duda procesos hijos

Publicado por Miguel Ángel (2 intervenciones) el 27/05/2019 17:52:32
Hola a todos, tengo que hacer un ejercicio que no termino de sbaer como hacer. Debajo voy a dejar el enunciado y en negrita voy a remarcar las partes que creo que no se hacer.

Escribid un programa en lenguaje C que, utilizando las llamadas al
sistema Unix vistas en la asignatura, comprima una serie de ficheros.
El programa recibirá por la lı́nea de comandos (vector argv) la lista
de ficheros a comprimir. Para cada fichero será preciso crear un proce-
so hijo y ejecutar la orden gzip redireccionando su entrada estándar
al fichero a comprimir y la salida estándar al fichero /tmp/pid.x,
donde pid es el identificador del proceso que ejecuta el programa y x
es la posición, dentro del vector argv, del fichero a comprimir.
Será
preciso ejecutar todas las compresiones concurrentemente y, a medi-
da que finalicen, el programa deberá mostrar un mensaje indicando
el nombre del fichero que ya está comprimido.


Yo lo haría así:

1
2
3
4
5
6
7
8
9
int main(int argc, char *argv[]){
 
 
for(f=0; f<argc; f++){
		if(fork()==0){
               //aqui es donde comprimo, pero no se como hacerlo.
		break;
		}
}


Me urge un poco la verdad, espero vuestras respuestas. Un saludo y gracias de antemano!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ejercicio duda procesos hijos

Publicado por Tom (619 intervenciones) el 03/06/2019 20:47:02
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/wait.h>
 
/* */
int main(int argc, char *argv[]) {
	pid_t mpid = getpid();
	pid_t *pids = calloc(argc - 1, sizeof(pid_t));
	char *ofname = NULL;
 
	for(int i = 1; i < argc; i++) {
		if((pids[i - 1] = fork()) == 0) {
			asprintf(&ofname, "/tmp/%d.%d", mpid, i - 1);
			close(0);
			if(open(argv[i], O_RDONLY) == 0) {
				close(1);
				if(open(ofname, O_CREAT | O_TRUNC | O_WRONLY, 0666) == 1) {
					execlp("gzip", "gzip", NULL);
					perror("exec");
				} else {
					perror(ofname);
				}
			} else {
				perror(argv[i]);
			}
			exit(1);
		} else if(pids[i - 1] < 0) {
			perror("fork");
		}
	}
	for(int i = 1; i < argc; i++) {
		int stat;
		pid_t cpid = wait(&stat);
		for(int p = 1; p < argc; p++) {
			if(pids[p - 1] == cpid) {
				if(stat) {
					fprintf(stderr, "Error compressing '%s'\n", argv[p]);
				} else {
					printf("Compressed '%s'\n", argv[p]);
				}
				break;
			}
		}
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar