LINUX.ORG.RU

#include <stdio.h>
#include <unistd.h>

void main ( void ) {

write(1, «$», 1);

}


у меня кстати все выводит


и с «\$» тоже, хотя и компилятору это несколько не нравится

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

Используется C99. Не выводит.

if(!sc(argv[1],"-E")||!sc(argv[1],"--show-ends")){
                int fd=open(argv[2],O_RDONLY);
                    if(fd<0)ferr(argv[2]);
                    dchk(fd);
                    int a;
                    while(read(fd,&a,1)>0){
                    if(a=='\n'){
                        write(1,"$",1);
                        write(1,"\n",1);
                    }
                    else write(1,&a,1);
                }
                close(fd);
                exit(0);
            }
Dorif ★★★
() автор топика
Ответ на: комментарий от Dorif

#include <stdio.h>
#include <unistd.h>

void main ( void ) {

write(1, «$», 1);
write(1, «\n»,1);
}


:/tmp$ cc -std=c99 hel.c -o hel
:/tmp$ ./hel
$
:/tmp$


что-то у вас не совсем так , может дескриптор закрыт ? например daemon() или fork() или еще как-нибудь?

Sylvia ★★★★★
()
Ответ на: комментарий от Dorif

А если вместо

write(1,"$",1);
написать
printf("$");
Будет работать? Вы уверены что эта часть (с выводом на экран) выполняется?

edigaryev ★★★★★
()
Ответ на: комментарий от pathfinder

Тьфу ты блин. Какая буферизация, если write используется.

pathfinder ★★★★
()
Ответ на: комментарий от Dorif

Очень бы было хорошо в нужных местах вместо 1 писать «stdout».
И эта... а условие вообще выполняется? И, кроме того, это точно не выводится ни в эмуляторе терминала, ни в виртуальных консолях?

proud_anon ★★★★★
()

Попробуй сразу после write сделать fsync(1).

Deleted
()
Ответ на: комментарий от proud_anon

Выполняется. Ибо еззь ещё несколько опций.

Dorif ★★★
() автор топика
Ответ на: комментарий от Sylvia

после записи стоит вызывать fflush(stdout);

В случае автора темы ИМХО логичнее всё-таки fsync.

Deleted
()
Ответ на: комментарий от Dorif

>Если что- то другое- да.
А какая операционная система, библиотека C и компилятор (ну на всякий случай, все же мистика)?

proud_anon ★★★★★
()
Ответ на: комментарий от Dorif

А что возвращает функция write()? Может там ошибка какая есть?

pathfinder ★★★★
()
Ответ на: комментарий от proud_anon

Очень бы было хорошо в нужных местах вместо 1 писать «stdout».

stdout - это экземпляр структуры FILE, а функция write принимает дескриптор типа int.

Deleted
()
Ответ на: комментарий от edigaryev

Ещё сырая и недописанная, так что если есть косяки- просто укажите на них.

/*     cloncat.c
  
Copyright 2010 Alexandr Dorif <dorif11@gmail.com>
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
  
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
   
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.*/
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h> 
#include <sys/types.h> 
void itoa(unsigned long n, char s[]); 
int help();
int ferr();
int stl(char s[]);
int sc(char*s, char* t);
void dchk(int f);
int main(int argc, char **argv){
    if(argc==3)if(!sc(argv[1],"-n")||!sc(argv[1],"--number")){
        int fd=open(argv[2],O_RDONLY);
        if(fd<0)ferr();
        dchk(fd);
        short a;
        unsigned long i;
        i=1;
        write(1,"1: ",3);
        while(read(fd,&a,1)>0){
            if(a=='\n'){
                unsigned long pos;
                pos=lseek(fd,0,SEEK_CUR);
                lseek(fd,1,SEEK_CUR);
                if(read(fd,&a,1)==0){
                    write(1,&a,1);
                    close(fd);
                    exit(0);
                    }
            else{
                char b[11];
                ++i;
                itoa(i,b);
                write(1,"\n",1);
                write(1,b,stl(b));
                write(1,": ",2);
            }
            lseek(fd,pos,SEEK_SET);
            }
        else write(1,&a,1);
        }
    }
    else if(!sc(argv[1],"-T")||!sc(argv[1],"--show-tabs")){
    int fd=open(argv[2],O_RDONLY);
        if(fd<0)ferr(argv[2]);
        int a;
        while(read(fd,&a,1)>0){
            if(a=='\t')write(1,"^I",2);
            else write(1,&a,1);
        }
        close(fd);
        exit(0);
    }
            else if(!sc(argv[1],"-E")||!sc(argv[1],"--show-ends")){
                int fd=open(argv[2],O_RDONLY);
                    if(fd<0)ferr(argv[2]);
                    dchk(fd);
                    int a;
                    while(read(fd,&a,1)>0){
                    if(a=='\n'){
                        write(1,"\044",1);
                        write(1,"\n",1);
                    }
                    else write(1,&a,1);
                }
                close(fd);
                exit(0);
            }
                else help();
    else if(argc>3||argc==1||!sc(argv[1],"-h")||!sc(argv[1],"--help"))help();
    else{
        if(!sc(argv[1],"-v")||(!sc(argv[1],"--version"))){
            write(1,"cloncat version 0.5\n",20);
            exit(0);
        }
        else{
            int fd=open(argv[1],O_RDONLY);
            if(fd<0)ferr();
            dchk(fd);
            short a;
            while(read(fd,&a,1)>0)write(1,&a,1);
            close(fd);
            exit(0);
    }
}
}
int help(){
        write(1,"usage: cloncat file\n"
        "-h or --help for help\n"
        "-v or --version displays version and exit\n"
        "-n or --number number the output lines\n",123);
        exit(0);
    }
void itoa(unsigned long n, char s[]){
     short i,j;
     char c;
     i=0;
     do{
         s[i++] = n % 10 + '0';
     }while((n/=10)>0);
     s[i]='\0';
     for(i=0,j=stl(s)-1;i<j;i++,j--){
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
 }
void dchk(int f){
    struct stat fs;
    fstat(f,&fs);
    if(S_ISDIR(fs.st_mode)){
        write(0,"It's a directory.\n",18);
        close(f);
        exit(1);
    }
}
int sc(char*s, char* t){
    unsigned long i;//number of something can't be lower, than zero
    for(i=0;s[i]==t[i];i++)if(s[i]=='\0')return 0;
    return s[i]-t[i];
}
int ferr(){
    switch(errno){
        case ENOENT:
        write(0, "No such file or directory.\n",27);
        break; 
        case EACCES:
        write(0,"Access denied.\n",15);
        break;
        default:
        write(0,"Unknown error\n",14);
        break;
    }
    exit(1);
}
int stl(char s[]){
    short i;
    i=0;
    while(s[i]!='\0')++i;
    return i;
}

Dorif ★★★
() автор топика
Ответ на: комментарий от Deleted

>stdout - это экземпляр структуры FILE, а функция write принимает дескриптор типа int.

Да, это я зачем-то сморозил.

proud_anon ★★★★★
()
Ответ на: комментарий от Sylvia

#include <errno.h>

и распечатать также еще и errno, если будет возврат -1

write 2

RETURN VALUE
On success, the number of bytes written is returned (zero indicates nothing was written). On
error, -1 is returned, and errno is set appropriately.

Sylvia ★★★★★
()
Ответ на: комментарий от pathfinder

Потом только напиши, что выдаст.

Dorif ★★★
() автор топика
Ответ на: комментарий от Sylvia

puts() не является системным вызовом. Он сам с помощью write написан.

Dorif ★★★
() автор топика
Ответ на: комментарий от Sylvia

Я предлагал puts для тестирования, чтобы понять, выводится ли в принципе «$», он не позволит перенаправить поток в файл. Но это уже не важно. У меня программа автора тоже не печатает «$». Правда, она в том месте вообще ничего не печатает. Сейчас посмотрим.

proud_anon ★★★★★
()
Ответ на: комментарий от Dorif

Либо инициализируйте переменную a нулем, либо когда проверяете на конец строки:

if(a=='\n'){ 
преобразуйте int в char:
if((char)a=='\n'){ 
, либо вместо int используйте char.

edigaryev ★★★★★
()
Ответ на: комментарий от edigaryev

Хм, почему же оно тогда нормально работает в

if(!sc(argv[1],"-T")||!sc(argv[1],"--show-tabs")){ 
    int fd=open(argv[2],O_RDONLY); 
        if(fd<0)ferr(argv[2]); 
        int a; 
        while(read(fd,&a,1)>0){ 
            if(a=='\t')write(1,"^I",2); 
            else write(1,&a,1); 
        } 
        close(fd); 
        exit(0); 
    } 

Dorif ★★★
() автор топика
Ответ на: комментарий от Dorif

Хм, почему же оно тогда нормально работает в

У меня не работает. Наверное у вас работает потому-что значение a равно нулю.

edigaryev ★★★★★
()
Ответ на: комментарий от Dorif

На самом деле, он прав. read читает поcharно. Почему оно нормально работает там, где работает, - это, скорее всего, вам там везет: в переменной оказывается 0.

И, кстати, желательно не

if(a=='\n') { 
    write(1,"\044",1); 
    write(1,"\n",1); 
} 
else write(1,&a,1);
а:
if(a=='\n') write(1,"\044",1);
write (1,&a,1);

proud_anon ★★★★★
()
Ответ на: комментарий от Dorif

>А как тогда прочесть спецсимволы?
Какие спецсимволы?

(кстати, по-моему, даже не по char'ам, а по байтам. Впрочем, на большинстве архитектур это одно и то же).

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Так, всё, это у меня глюки были... Поменял на char- всё заработало. Это я ещё когда юзал не системные вызовы, а функции из stdio.h юзал int для того, чтобы EOF норм обрабатывать.

Dorif ★★★
() автор топика
Ответ на: комментарий от Dorif

>чтение EOF, сравнение с EOF...
read возвращает число прочтенных байт, т.е. 0, если поток кончился (ну или если читать надо было 0 байт); -1 при ошибке.

proud_anon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.