LINUX.ORG.RU

ошибка сегментирования


0

1

помогите доделать код , когда после первого открытия файла пытаюсь его открыть ещё раз , то открывает всё равно первый , а если убиваю процесс то выдается ошибка сегментации

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include<dirent.h>

main()&#123;
       char buf&#91;100&#93;;
       char* p=&buf&#91;0&#93;;
       int pid,n,i,c;
       char way&#91;100&#93;="/proc";
       struct dirent **namelist;
       n=scandir(way, &namelist, 0, alphasort);
       while(n--)&#123;
                    printf("%s\n", namelist&#91;n&#93;->d_name);
                    free(namelist&#91;n&#93;);
                    &#125;
       free(namelist);
      printf("enter /proc/PID/status instead of PID write are necessery pid :\n");
      fgets(way,sizeof way,stdin);
M1: if(way&#91;strlen(way)-1&#93;=='\n')&#123;
                                            way&#91;strlen(way)-1&#93;='\0';
                                            &#125;
       printf("open file status in dir:\n");
       for(n=0;n<100;n++)&#123;
                                  printf("%c",way&#91;n&#93;);
                                  &#125;
       printf("\n");
       FILE* f=fopen(way,"r");
       while(!feof(f) )&#123;
                           *p++=fgetc(f);
                           &#125;
       fclose(f);

       for(n=0;n<100;n++)&#123;
                                  printf("%c",buf&#91;n&#93;);
                                  &#125;
       c=getpid();
       printf("\n\nPID this programm:%d", c);
       printf("\nif it is that process which you want kill, press 1 \nif it is that another proc, press 2\n" );
       scanf("%d", &n);
       if (n!=1)&#123;
                  printf("enter anoter /proc/PID/status\n");
                  scanf("%s%*c",&way);
                  goto M1;
                  &#125;
       else&#123;
             printf("for confirmation enter PID:\n");
             scanf("%d", &pid);
             kill(pid, SIGKILL);
             &#125;
&#125;



Последнее исправление: suv121 (всего исправлений: 2)

Настоящий программист может написать на любом языке программу на Fortran-77.

bvvv
()

Это кромешный писец...

[code]n=scandir(way, &namelist, 0, alphasort); while(n--){ [/code] Что если n=0?

И это только начало.

anonymous
()

char* p=&buf[0]; Улыбнуло...

Сначало
FILE* f=fopen(way,«r»);
А помом
pclose(f);

Интересно пишешь...

Dennis7
()
Ответ на: комментарий от anonymous

Вы всё ещё спрашиваете, где у вас сегфольт?

Да где угодно.

anonymous
()

char way[100]=«/proc»;

тонко!

ACR
()

>goto M1;

Я долго думал, что тут написать, но так и не придумал. Извини.

anonymous
()
Ответ на: комментарий от suv121

Лично я в этом кромешном п****це разглядел вот это:

char buf[100];
char* p=&buf[0];
...
while(!feof(f) )
{
  *p++=fgetc(f);
}

Кто вам сказал, что вы уберетесь в 100 символов?

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

мне нужно открыть файл статус и считать от туда только первые несколько строк , в которых информация о имени процесса , пид и статус

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

все 100 в программе поменяй на 100000 зацени чо получится

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

ну давай напиши задание:мы знаем имя процесса который нужно убить, написать программу которая открывает директорию proc , в этой директории нужно полазить по папкам , посмотреть файлы status и найти нужный нам , обязательно использовать scandir

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

скажи своему учителю информатики что задание не полит-корректное и что он мудак и что только мудаки используют linux way по засиранию VFS и что круче юзать sysctl чем scandir

ACR
()
Ответ на: комментарий от Dennis7

надо было использовать scandir а можно увидеть код без scandir , но чтобы было можно лазить по папкам

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

надо было использовать scandir а можно увидеть код без scandir , но чтобы было можно лазить по папкам

man opendir, man readir

Begemoth ★★★★★
()

А ведь всего-то надо было проверять возвращаемые значения функций.

FILE* f=fopen(way,"r");
Begemoth ★★★★★
()
Ответ на: комментарий от suv121

> и в чем ошибка?

похоже, в днк…

> когда после первого открытия файла пытаюсь его открыть ещё раз , то открывает всё равно первый

*p++=fgetc(f);

а теперь сядь и подумай, куда второй раз будет записан ввод.

> а если убиваю процесс то выдается ошибка сегментации

у меня твой код ещё на старте вызывает SIGSEGV/SIGBUS из-за того, что /proc/*/status-файлы больше 100 байт. тебе уже несколько раз это говорили, кстати.

arsi ★★★★★
()

Скажите же мне, ну почему, почему если тема сообщения говорит о сегфолте или ещё каком-нибудь тупейшем фейле — внутри всегда код на плюсах?
Товарищи говнокодеры, пожалуйста, молю вас, просто-таки: идите загрязнять своими уродцами какой-то другой язык. Моё сердце не выдерживает уже этих издевательств.

Remington
()

Лютый говнокод itt. Пеши исчо, а лучше сразу на govnokod.ru

anonymous
()
Ответ на: комментарий от Remington

Скажите же мне, ну почему, почему если тема сообщения говорит о сегфолте или ещё каком-нибудь тупейшем фейле — внутри всегда код на плюсах?

Потому что в других языках сегфолт называется по другому.

Товарищи говнокодеры, пожалуйста, молю вас, просто-таки: идите загрязнять своими уродцами какой-то другой язык.

Перейдут на Java илм там Python или Ruby будут вопросы «почему программа падает/не работает» по причине необработанных исключений.

Begemoth ★★★★★
()

Посмотри книгу UNIX профессиональное программирование «У. Ричард Стивенс, Стивен A.Раго» .. Там всё это есть, и нормально объяснено , как нужно что делать.

Эта книга есть на all-ebooks.ru

По коду могу сказать, что там всё плохо.

char way[100]=«/proc»; можно заменить на char way[]=«/proc\0»;

for(n=0;n<100;n++){ printf(«%c»,way[n]); } Будет медленно работать. Из за того, что ты 100 раз вызовишь функцию printf, и без того медленную.

После FILE* f=fopen(way,«r»); надо делать проверку, удалось ли вообще открыть файл, и если файл открыт, то уже после этого читать его..и закрывать.

int pid,n,i,c; - давай осмысленные имена.. char* p=&buf[0]; замени на char *p=buf; и тд... Всё в ваших руках.

Deleted
()

мама дарагая! :)

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

...
if (second_open) {
if ((fgets(buf, sizeof(buf), f)) != NULL) printf(«Got it!...»);
}
...
:)))))

Dennis7
()
Ответ на: комментарий от suv121

Посмотри книгу которую я посоветовал, там всё это есть..и не поленись...осиль её. Все вопросы отпадут, по крайней мере с функциями unix .

То что тебе нужно, в самом начале книги, примеры с открытием файла и чтением..

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