C/C++ en Kubuntu

B

La cuestion es que C/C++ en sí funciona, pero estoy progamando con librerias que han de hacer llamadas al sistema tipo fork(), wait(), execlp(), getenv()m setenv() y demás y no existen.

Alguien me puede ayudar? ¿Que paquete he de instalar? Putas practicas de Sistemas Operativos!!!. Por si ayuda, tengo el dvd de debian.

Gracias de antemano

Y

Hombre, en principio con hacer apt-get install gcc g++ es suficiente. Si tienes conflicto con las versiones, ya que de una versión a otra cambian algunas librerías (incluso cambian un poco el nombre) prueba a instalar distintas versiones.

Por ejemplo, ahora mismo la actual es el gcc-3.4 y g++-3.4 que no se en que cambiará porque no lo he usado aún, pero del gcc-2.95 al gcc-3.3 en debian cambia radicalmente algunas librerías.
Mira que no estés usando el gcc-3.4 o prueba con distintas versiones de los compiladores.

B

No, ese no es el problema. Si yo compilo un programa en C normal (el tipico hola mundo) funciona correctamente. Lo que ocurre es que las librerias que necesito para hacer llamadas al sistema especificas no funcionan. Me han dicho que pruebe poniendo: "apt-get install build-essential", pero ya lo he probado y me da errores tontos. ¿Que puedo hacer?

Gracias Yonnah que eres el unico que contestas :D Saludos!

Y

Pero eso es lo que te digo. El hola mundo funciona en cualquier parte, pero las librerias de una version a otra cambian.

Publica dicho errores, siempre ayuda mejor que dar soluciones hipotéticos. Tanto esos errores tontos como el resto de errores.

raul84

Haber si es que no sigues el estandar ANSI C y usas librerias de windows que no funcionan en Linux.
A mi me pasó eso.

Ahi tienes funciones de C y las librerias que utilizan
http://www.phim.unibe.ch/comp_doc/c_manual/C/FUNCTIONS/funcref.htm

maRc

Pregunta tonta pero... ¿incluyes los ficheros de cabecera?

Por ejemplo, para usar el fork necesitas incluir estos dos ficheros:
#include <sys/types.h>
#include < uinstd.h>

Para saber cuales son los del resto de llamadas al sistema, man llamada.

Y

Ustia que despiste, es verdad :P, yo hablandote de las versiones y es porque usas librerias de win :P
Na, me tiro por un puente

B

Aquí teneis el programa (el que intentaba compilar antes y ahora funciona):

#include <stdio.h>
#include <stdlib.h>
#include
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


int main (int argc, char * argv[]) {
int t1[2], t2[2], t3[2];
int estado, buffer = 1, f1, f2, fd;
char c;

if (argc != 3) {
printf("Necesarios dos argumentos\n");
exit(-1);
}

// Creamos la tuberia para introducir los datos
pipe(t1);


if (fork() == 0) {
// Creamos las tuberias de sincronizacion entre P1 y P2
pipe(t2); pipe(t3);


// Escribimos en la tuberia para que comience P1
write(t2[1], &buffer, sizeof(int));

// Abrimos los ficheros de caracteres
f1 = open(argv[1], O_RDONLY);
f2 = open(argv[2], O_RDONLY);

// Proceso P1
if (fork() == 0) {
  close(t1[0]); close(t2[1]); close(t3[0]);
  
  // Procesar un unico caracter
  while (read(t2[0], &buffer, sizeof(int)) && buffer != 0) {
if (read(f1, &c, sizeof(char)))
  write(t1[1], &c, sizeof(char));
else
  buffer = 0;

// Pasamos el testigo a P2
write(t3[1], &buffer, sizeof(int));
  }

  // Procesar el resto de caracteres
  if (buffer == 0) {
while (read(f1, &c, sizeof(char)))
  write(t1[1], &c, sizeof(char));
  }
}

// Proceso P2
else {
  close(t1[0]); close(t2[0]); close(t3[1]);
  
  // Procesar un unico caracter
  while (read(t3[0], &buffer, sizeof(int)) && buffer != 0) {
if (read(f2, &c, sizeof(char)))
  write(t1[1], &c, sizeof(char));
else
  buffer = 0;

// Pasamos el testigo a P1
write(t2[1], &buffer, sizeof(int));
  }
  
  // Procesar el resto de caracteres
  if (buffer == 0) {
while (read(f2, &c, sizeof(char)))
  write(t1[1], &c, sizeof(char));
  }
}

close(f1);
close(f2);

}


// Proceso P3 (Padre)
else {
wait(NULL);
close(t1[1]);


// Leemos todos los caracteres ordenados y los mostramos
printf("Caracteres leidos: ");
while (read(t1[0], &c, sizeof(char))) {
  printf("%c", c);
}
printf("\n");

}

return 0;
}

Ya lo solucioné poniendo el DVD de debian, reconfigurando apt con apt-setup y poniendo:
apt-get install build-essential
apt-get install glibc-doc

Gracias de todas formas, Saludos!

Usuarios habituales