Erro ao compilar programas com as macros O_BINARY e O_TEXT [RESOLVIDO]

1. Erro ao compilar programas com as macros O_BINARY e O_TEXT [RESOLVIDO]

Anderson Miranda
Anderson1911

(usa Ubuntu)

Enviado em 08/08/2012 - 17:05h

tentei compilar o segunte código:
#include <stdio.h>
#include <fcntl.h>
#include <sys/fcntl.h>
#include <sys/io.h>
#include <sys/types.h>
#include <sys/stat.h>

void main (int argc, char *argv[]){
int origem,destino;
char buffer[1024];
int bytes_lidos;

if (argc < 3)
printf("É preciso especificar os arquivos de origem e de destino\n");
else if((origem = open(argv[1], O_BINARY | O_RDONLY)) == -1)
printf("Erro ao abrir %s\n", argv[1]);
else if((destino = open(argv[2], O_WRONLY | O_BINARY | O_TRUNC | O_CREAT | S_IWRITE)) == -1)
printf("Erro ao abrir %s\n", argv[2]);
else{
while (!eof(origem))
{
if((bytes_lidos = read(origem, buffer, sizeof(buffer))) <= 0)
printf("Erro ao gravar no arquivo de destino\n");
}
close(origem);
close(destino);
}
}


mas o GCC exibe o seguinte erro:

gcc -o copia copia.c
copia.c: In function ‘main’:
copia.c:15:34: error: ‘O_BINARY’ undeclared (first use in this function)
copia.c:15:34: note: each undeclared identifier is reported only once for each function it appears in



em outro código o GCC acusou a ausência de "O_TEXT", as macros estão declaradas na io.h, mas a mesma está incluida, alguem já teve esse problema? existe mais algum header pra adicionar?


  


2. Re: Erro ao compilar programas com as macros O_BINARY e O_TEXT [RESOLVIDO]

cr0n
_di0

(usa FreeBSD)

Enviado em 11/08/2012 - 01:38h

Quais valores definido nessas constantes?
Talvez um hack:

#ifndef O_BINARY
#define O_BINARY 0
#endif

o mesmo para outra constante


3. Re: Erro ao compilar programas com as macros O_BINARY e O_TEXT [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 11/08/2012 - 02:03h

http://www.warpspeed.com.au/cgi-bin/inf2html.cmd?..\html\book\Toolkt40\XPG4REF.INF+205

If neither O_BINARY or O_TEXT is specified, the default will be O_TEXT; it is an error to specify both O_BINARY and O_TEXT. You must specify one of the access mode flags, O_RDONLY, O_WRONLY, or O_RDWR. There is no default.


Por enquanto.


4. Re: Erro ao compilar programas com as macros O_BINARY e O_TEXT [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/08/2012 - 06:40h

Esses lixos não existem no mundo Unix (e não deveriam existem nem mesmo no mundo DOS/Windows/OS/2, já que open/read/write/close são projetadas para ser uma interface de baixo nível, não cabendo, no meu entender, qualquer tradução de formato de dados).

Eu diria para você suprimir essa porcaria do seu código. Se não puder fazê-lo, defina para essas macros o valor 0 (zero).


5. Re: Erro ao compilar programas com as macros O_BINARY e O_TEXT [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 20/08/2012 - 07:50h

paulo1205 escreveu:

Esses lixos não existem no mundo Unix (e não deveriam existem nem mesmo no mundo DOS/Windows/OS/2, já que open/read/write/close são projetadas para ser uma interface de baixo nível, não cabendo, no meu entender, qualquer tradução de formato de dados).

Eu diria para você suprimir essa porcaria do seu código. Se não puder fazê-lo, defina para essas macros o valor 0 (zero).


Caramba!!!

Eu não colocaria com tanta veemência porque alguém que costuma usar pode se sentir ofendido. Não sei o motivo pessoal de usarem, então existe em algum lugar e este uso de deve ser compreendido.

Pelo menos compreender o funcionamento neste exemplo, testar as possibilidade e de que se trata. Que parece-me ser o caso aqui.

Mas é bom saber que poderia procurar por outras alternativas e que posso considerar que esta pode não ser a melhor delas, mesmo se alguém com autoridade a aconselhasse.


6. Re: Erro ao compilar programas com as macros O_BINARY e O_TEXT [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/08/2012 - 09:39h

Quem quer que costume usar não deveria usar. E explico por quê.

Tais macros e o sentido a elas atribuído são uma abordagem simplesmente errada, pois a interface na qual elas foram indevidamente inseridas é para I/O de baixo nível, na qual não caberia mais fazer interceptação dos dados para adicionar qualquer esquema de tradução. Não que esquemas de tradução de formato não possam existir, mas seu lugar seria num nível mais alto (funcionalidade equivalente existe na biblioteca padrão: fopen() aceita o atributo "t" em seu segundo argumento para indicar que o arquivo aberto usará representação de texto).

Além da razão acima, há outros motivos para não usar essas macros: (1) não existe coisa semelhante no mundo Unix (que é o mundo em que foi criada a interface open()/read()/write()/lseek()/close() -- e que é, aliás, o foco principal deste Fórum); e (2) no mundo Windows, tal interface de baixxo nível foi removida da biblioteca C fornecida pela Microsoft, que encoraja o uso ou de bibliotecas de mais alto nível ou de primitivas nativas da plataforma Windows.


7. Re: Erro ao compilar programas com as macros O_BINARY e O_TEXT [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/08/2012 - 10:01h

Há, aliás, outros problemas, que indicam que o usuário está usando referências inadequadas ou obsoletas (além de cometer seus próprios erros):

* o tipo de retorno de main() _DEVE_ ser int (corrigindo isto, ter-se-á também de fazer com que o programa sempre termine devolvendo esse valor inteiro, quer com return dentro de main(), quer com exit());

* aquele S_IWRITE não deveria aparecer misturado com as outras opções com prefixo "O_" no segundo argumento de open() (as constantes "S_" referem-se ao terceiro argumento);

* não existe a função eof() (o fim de arquivo se detecta quando read() retorna 0 (zero));

* mostra-se uma mensagem de erro de escrita em função do valor de retorno de read() (ou se muda a mensagem para indicar erro de leitura, ou se muda a operação de read() para write()).


8. Re: Erro ao compilar programas com as macros O_BINARY e O_TEXT [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 20/08/2012 - 10:05h

paulo1205 escreveu:

Quem quer que costume usar não deveria usar. E explico por quê.

Tais macros e o sentido a elas atribuído são uma abordagem simplesmente errada, pois a interface na qual elas foram indevidamente inseridas é para I/O de baixo nível, na qual não caberia mais fazer interceptação dos dados para adicionar qualquer esquema de tradução. Não que esquemas de tradução de formato não possam existir, mas seu lugar seria num nível mais alto (funcionalidade equivalente existe na biblioteca padrão: fopen() aceita o atributo "t" em seu segundo argumento para indicar que o arquivo aberto usará representação de texto).

Além da razão acima, há outros motivos para não usar essas macros: (1) não existe coisa semelhante no mundo Unix (que é o mundo em que foi criada a interface open()/read()/write()/lseek()/close() -- e que é, aliás, o foco principal deste Fórum); e (2) no mundo Windows, tal interface de baixxo nível foi removida da biblioteca C fornecida pela Microsoft, que encoraja o uso ou de bibliotecas de mais alto nível ou de primitivas nativas blda plataforma Windows.


BLZ. Por padrões, compreendo ANSI C, ISO C, POSIX, LSB, IEEE.

Encontrei outros links:

da lseek(); http://pubs.opengroup.org/onlinepubs/009695399/functions/lseek.html

e da open(): http://pubs.opengroup.org/onlinepubs/009695399/functions/open.html

Estes links, até outras páginas nestes sites, informam referências sobre alguns padrões que tenham a ver com essa função, digamos assim.

Há até uma referência em se usar open() ao invés de creat(). Essa creat() eu tenho certeza que foi inventada no Unix original.

Eu compreendi que a opção de alto nível é melhor por deixar mais legível, pela portabilidade e pela simplicidade no uso.

Falta compreender quando surgiram estas opções e porque não fazem parte, por causa desses nomes de padrões das citações.

A M$ ter deixado de lado não quer dizer muita coisa, ela faz isso com tudo o que não interessa mais prá ela :\








9. Re: Erro ao compilar programas com as macros O_BINARY e O_TEXT [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/08/2012 - 10:25h

Listeiro 037 escreveu:

BLZ. Por padrões, compreendo ANSI C, ISO C, POSIX, LSB, IEEE.


Quando eu falo de biblioetca padrão, não há dúvidas: é a biblioteca padrão definida para a linguagem C em ambiente self-hosting, independentemente de arquitetura ou SO.

Eu compreendi que a opção de alto nível é melhor por deixar mais legível, pela portabilidade e pela simplicidade no uso.

Falta compreender quando surgiram estas opções e porque não fazem parte, por causa desses nomes de padrões das citações.


O link que você indicou que contém referências a O_BINARY e O_TEXT parecem ser de um compilador C da IBM para OS/2 (da apresentação, nominalmente o The IBM Developer's Toolkit for OS/2 Warp Version 4).

A M$ ter deixado de lado não quer dizer muita coisa, ela faz isso com tudo o que não interessa mais prá ela :\


Quer dizer que o programa dele também não vai compilar no Windows. Só que em vez de faltarem apenas as macros, não existirão as próprias funções onde tais macros poderiam ser usadas.




10. Re: Erro ao compilar programas com as macros O_BINARY e O_TEXT [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 20/08/2012 - 12:03h

Realmente não compilará. Bem lembrado. A M$ pensou nisto também: elá dá a mínima prá compatibilidade quando interessa. Nem me lembro mais daquela coisa :\

Encontrei outra referência: http://www.unix.com/programming/8849-ansi-c-vs-posix.html

Refere-se à chamadas de kernel, que é melhor trabalhar com C do que fazer etapas chamada a chamada.

No caso refere-se especificamente ao C padrão ANSI e ao padrão POSIX. O ruim de um padrão é que existem muitos.

Programa de auto-hospedagem já havia no Unix antigo, cc por exemplo. O que não haviam definido eram os padrões. Inclusive havia a tal creat(). Dessa tenho certeza porque eu lembro de um comentário do autor. Então essas chamadas existiam.

O que reparei é a existência de open() e _open(), embora não tenha certeza do motivo.

Nisto eu me lembrei do uso da função ioctl(). Geralmente vejo usarem essas chamadas tipo read()/write() quando ioctl() aparece, com usos bem diversos que trabalhar num arquivo de texto, por exemplo. Um tópico sobre ela com todas as possibilidades seria bem extenso.


11. Re: Erro ao compilar programas com as macros O_BINARY e O_TEXT [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/08/2012 - 20:52h

Há de se tomar cuidado para não comparar coisas distintas.

O ANSI C define uma linguagem de programação e, quase como um apêndice, uma definição de um ambiente comum que deve ser suportado por todas as implementações self-hosted. Tal definição é agnóstica a respeito de arquitetura, dispositivos, sistema operacional, multi-programação ou gestão de recursos (a não ser os recursos necessários para que um programa em C genérico funcione).

Já o POSIX.1 não descreve linguagem de programação, mas prescreve o uso da linguagem C, e define uma biblioteca de programação que inclui a biblioteca padrão do ANSI C e a estende, tendo em mente particularidades do restante das definições de um ambiente programação que se pode chamar de sistema operacional, uma vez que apresenta conceitos gestão de memória, dispositivos, sistemas de arquivos, e processos e comunicação entre eles, terminais, redes etc.


12. Re: Erro ao compilar programas com as macros O_BINARY e O_TEXT [RESOLVIDO]

Anderson Miranda
Anderson1911

(usa Ubuntu)

Enviado em 20/08/2012 - 21:11h

vlw amigos, estou usando o livro C/C++ a Biblia do Jansa e tenho que eliminar tudo que seja do windows, mas algumas funções que não fazer parte das bibliotecas "dos.h", "bios.h" e "dir.h" ainda geram duvidas se são multiplataforma ou não.

Obrigado pelos esclarecimentos :)



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts