Pipes, scanf, y manual de C
Hola a todos, tengo un programa en C que hace lo siguiente: //cliente char str[256]; scanf(%s, str); write (envio, str, strlen(str)); donde envio es el canal que apunta a una pipe. por otro lado, otro proceso lee de la pipe: //servidor read(recept, str, strlen(str)); donde recept es el canal que apunta a la pipe. Pues bien, parece ser que si en cliente le introduces por ejemplo ls -l -a, el servidor lee de la pipe solamente ls !!! Osea que parece ser que dicho comando el scanf lo guarde en lugar de ls -l -a\0, como ls\0 -l\0 -a\0 o es el scanf que me extraña muchísimo por que no sabría por qué hace eso, o es el write, que tampoco veo por que, o es la lectura de la pipe en el read. No me equivoco si afirmo que scanf guardaría una frase como El perro de san Roque\0 verdad? De paso, hay alguna pagina oficial de C? alguna como el manual de Java que tienen en la de sun. Gracias! ---Publicidad Únete a los miles de sin pareja en Meetic... ¡te vas a enamorar! http://www.iespana.es/_reloc/email.meetic
Re: Pipes, scanf, y manual de C
On Tue, Dec 23, 2003 at 11:47:52AM +0100, Alberto wrote: Hola a todos, tengo un programa en C que hace lo siguiente: //cliente char str[256]; scanf(%s, str); /* el segundo argumento debe ser un puntero */ scanf(%s, str); write (envio, str, strlen(str)); donde envio es el canal que apunta a una pipe. por otro lado, otro proceso lee de la pipe: //servidor read(recept, str, strlen(str)); donde recept es el canal que apunta a la pipe. Pues bien, parece ser que si en cliente le introduces por ejemplo ls -l -a, el servidor lee de la pipe solamente ls !!! Osea que parece ser que dicho comando el scanf lo guarde en lugar de ls -l -a\0, como ls\0 -l\0 -a\0 o es el scanf que me extraña muchísimo por que no sabría por qué hace eso, o es el write, que tampoco veo por que, o es la lectura de la pipe en el read. No me equivoco si afirmo que scanf guardaría una frase como El perro de san Roque\0 verdad? De paso, hay alguna pagina oficial de C? alguna como el manual de Java que tienen en la de sun. man funcion en Linux/Bsd te va a dar la página de manual de las funciones de librería standard de C. Comprate o conseguite el pdf de The C programing Language de Kernighan y Ritchie. Sds Gracias! ---Publicidad Únete a los miles de sin pareja en Meetic... ¡te vas a enamorar! http://www.iespana.es/_reloc/email.meetic -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED] -- Fernando M. Maresca Cel: (54) 221 15 502 3938 Cel: 0221-15-502-3938
Re: Pipes, scanf, y manual de C
El mar, 23-12-2003 a las 10:47, Alberto escribió: [...] //cliente char str[256]; scanf(%s, str); write (envio, str, strlen(str)); [...] Pues bien, parece ser que si en cliente le introduces por ejemplo ls -l -a, el servidor lee de la pipe solamente ls !!! Osea que parece ser que dicho comando el scanf lo guarde en lugar de ls -l -a\0, como ls\0 -l\0 -a\0 o es el scanf que me extraña muchísimo por que no sabría por qué hace eso, o es el write, que tampoco veo por que, o es la lectura de la pipe en el read. No me equivoco si afirmo que scanf guardaría una frase como El perro de san Roque\0 verdad? Hola, Haz man scanf y comprobarás que detiene la lectura de la cadena al encontrar el primer blanco. Si supieses que son exactamente tres cadenas, podrías hacer: scanf(%s %s %s,str1,str2,str3); pero esto es bastante poco flexible. Usa gets() si quieres, esta función te permite leer toda la entrada saltándose los blancos, pero eso sí, como te advierte la página del man: Puesto que es imposible saber, sin conocer de antemano los datos, cuántos caracteres va a leer gets(), y puesto que gets() continuará guardando caracteres una vez alcanzado el final del búfer, su empleo es extremadamente peligroso. Muchas veces ha sido utilizado para comprometer la seguridad de un sistema. En su lugar emplee fgets() siempre que pueda. Saludos, Belén - Ana Belén Barragáns Martínez Departamento de Enxeñería Telemática E.T.S.E. Telecomunicación Tlf: +34-986812181 Campus As Lagoas-MarcosendeFax: +34-986812116 36200 - Vigo mailto: [EMAIL PROTECTED] Pontevedra (Spain) URL: http://www-gris.det.uvigo.es/~belen -
Re: Pipes, scanf, y manual de C
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 El Martes, 23 de Diciembre de 2003 12:54, Fernando M. Maresca escribió: On Tue, Dec 23, 2003 at 11:47:52AM +0100, Alberto wrote: Hola a todos, tengo un programa en C que hace lo siguiente: //cliente char str[256]; scanf(%s, str); /* el segundo argumento debe ser un puntero */ scanf(%s, str); Extraído de la página del man de scanf: s Matches a sequence of non-white-space characters; the next pointer must be a pointer to char, and the array must be large enough to accept all the sequence and the terminating NUL character. The input string stops at white space or at the maxi- mum field width, whichever occurs first. Es decir, lo tenias bien, pero únicamente lee hasta el primer separador (espacio, tabulador, salto de línea, fin de fichero, etc.) write (envio, str, strlen(str)); donde envio es el canal que apunta a una pipe. por otro lado, otro proceso lee de la pipe: //servidor read(recept, str, strlen(str)); donde recept es el canal que apunta a la pipe. Pues bien, parece ser que si en cliente le introduces por ejemplo ls -l -a, el servidor lee de la pipe solamente ls !!! Osea que parece ser que dicho comando el scanf lo guarde en lugar de ls -l -a\0, como ls\0 -l\0 -a\0 o es el scanf que me extraña muchísimo por que no sabría por qué hace eso, o es el write, que tampoco veo por que, o es la lectura de la pipe en el read. No me equivoco si afirmo que scanf guardaría una frase como El perro de san Roque\0 verdad? De paso, hay alguna pagina oficial de C? alguna como el manual de Java que tienen en la de sun. man funcion en Linux/Bsd te va a dar la página de manual de las funciones de librería standard de C. Comprate o conseguite el pdf de The C programing Language de Kernighan y Ritchie. Sds Gracias! ---Publicidad Únete a los miles de sin pareja en Meetic... ¡te vas a enamorar! http://www.iespana.es/_reloc/email.meetic -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED] -- Fernando M. Maresca Cel: (54) 221 15 502 3938 Cel: 0221-15-502-3938 - -- - --+--- José Manuel Pérez Fuente | Universidad del País Vasco Punto Neutro EuskoNIX (UPV/EHU) | E-mail: [EMAIL PROTECTED] Plaza Elhuyar, 1 (Edif. Barriola) | Tel.: +34 943 018 281 20018 San Sebastián (SPAIN) | Fax.: +34 943 219 306 - --+--- -BEGIN PGP SIGNATURE- Version: GnuPG v1.2.3 (GNU/Linux) iD8DBQE/6D0rRRyB6LZLkhsRAhLyAJ9tFqaxJykUbt5nVb5iD0mxwh6ntgCePfq1 RvzgzXxatPnptuvwTdhx3ZM= =QbLg -END PGP SIGNATURE-
Re: Pipes, scanf, y manual de C
At 23/12/03 11:47, Alberto wrote: Hola a todos, tengo un programa en C que hace lo siguiente: //cliente char str[256]; scanf(%s, str); write (envio, str, strlen(str)); donde envio es el canal que apunta a una pipe. por otro lado, otro proceso lee de la pipe: //servidor read(recept, str, strlen(str)); donde recept es el canal que apunta a la pipe. Pues bien, parece ser que si en cliente le introduces por ejemplo ls -l -a, el servidor lee de la pipe solamente ls !!! Osea que parece ser que dicho comando el scanf lo guarde en lugar de ls -l -a\0, como ls\0 -l\0 -a\0 o es el scanf que me extraña muchísimo por que no sabría por qué hace eso, o es el write, que tampoco veo por que, o es la lectura de la pipe en el read. No me equivoco si afirmo que scanf guardaría una frase como El perro de san Roque\0 verdad? De paso, hay alguna pagina oficial de C? alguna como el manual de Java que tienen en la de sun. Gracias! Si no recuerdo mal el C debería ser algo como esto //cliente char str[256]; scanf(%s, str); write (envio, str, strlen(str)); /*no se puede poner el , str ya es un puntero*/ //servidor read(recept, str, strlen(str)); /*otra vez lo mismo*/ Prueba con esto y cuentanos Un saludo Pedro
RE: Pipes, scanf, y manual de C
From: Alberto [EMAIL PROTECTED] To: debian-user-spanish@lists.debian.org Subject: Pipes, scanf, y manual de C Date: Tue, 23 Dec 2003 11:47:52 +0100 Hola a todos, tengo un programa en C que hace lo siguiente: //cliente char str[256]; scanf(%s, str); write (envio, str, strlen(str)); Para leer puedes emplear scanf(^\n,string); leera todo (incluido espacios) hasta que encuentre '\n' (pulses intro), puedes cambiar \n por otra letra o secuencia cualquiera. _ Deja tu CV y recibe ofertas personalizadas de trabajo en tu buzón. http://www.msn.es/Empleo/