Форум программистов, компьютерный форум CyberForum.ru

Ошибка сегментации - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
mansp
18 / 18 / 0
Регистрация: 07.11.2010
Сообщений: 136
11.12.2011, 16:22     Ошибка сегментации #1
Зарание благодарен за помощ
собственно вот мой код . он должен считывать информацию о процессе с фалйа ,а принимать на вход пид процесса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <string.h>
 
 
using namespace std;
 
int main(int argc, char* argv[])
{
    FILE* f = fopen(strcat("/proc/",strcat(argv[1],"/stat")),"r+");
 
    int pid;
    char comm [100] ;
    int  state;
    int tty_nr;
    long unsigned int utime;
    long double cutime;
    long double ld;
 
    fscanf(f,"%d ,%s, %c, %d, %lu, %lu, %ld, %ld,",&pid, &comm, &state, &tty_nr, &utime, &cutime, &ld);
    printf("%d ,%s ,%c ,%d ,%lu ,%lu ,%ld ,%ld",&pid, &comm, &state, &tty_nr, &utime, &cutime, &ld);    
    return 0;
}
в консоле запускал g++ ошибок не выдавал .... только много предупреждений
создал бинарник
g++ -o pi pi.c
запускаю
./pi 1490
и тут появляютса эта ошибка(
Может кто знает в чем проблема? в линуксе я плохой кодер((
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2011, 16:22     Ошибка сегментации
Посмотрите здесь:

Ошибка сегментации C++
Непонятная ошибка сегментации C++
C++ ошибка сегментации
Ошибка Сегментации C++
C++ Ошибка сегментации из ниоткуда
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
11.12.2011, 16:28     Ошибка сегментации #2
Цитата Сообщение от mansp Посмотреть сообщение
только много предупреждений
они не просто так пишутся
вот по поводу попытки изменить константную строку в
Цитата Сообщение от mansp Посмотреть сообщение
strcat("/proc/",strcat(argv[1],"/stat")),"r+");
наверняка было написано

к тому же все проблемы решаются дебаггером - gdb + backtrace
mansp
18 / 18 / 0
Регистрация: 07.11.2010
Сообщений: 136
11.12.2011, 16:43  [ТС]     Ошибка сегментации #3
Цитата Сообщение от alex_x_x Посмотреть сообщение
они не просто так пишутся
вот по поводу попытки изменить константную строку в

наверняка было написано
да нет по поводу этого ничего не было
Код
pi.c: В функции «int main(int, char**)»:
pi.c:12:57: предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]
pi.c:22:94: предупреждение: format «%s» expects argument of type «char*», but argument 4 has type «char (*)[100]» [-Wformat]
pi.c:22:94: предупреждение: format «%c» expects argument of type «char*», but argument 5 has type «int*» [-Wformat]
pi.c:22:94: предупреждение: format «%ld» expects argument of type «long int*», but argument 8 has type «long double*» [-Wformat]
pi.c:22:94: предупреждение: format «%ld» expects argument of type «long int*», but argument 9 has type «long double*» [-Wformat]
pi.c:23:91: предупреждение: format «%d» expects argument of type «int», but argument 2 has type «int*» [-Wformat]
pi.c:23:91: предупреждение: format «%s» expects argument of type «char*», but argument 3 has type «char (*)[100]» [-Wformat]
pi.c:23:91: предупреждение: format «%c» expects argument of type «int», but argument 4 has type «int*» [-Wformat]
pi.c:23:91: предупреждение: format «%d» expects argument of type «int», but argument 5 has type «int*» [-Wformat]
pi.c:23:91: предупреждение: format «%lu» expects argument of type «long unsigned int», but argument 6 has type «long unsigned int*» [-Wformat]
pi.c:23:91: предупреждение: format «%ld» expects argument of type «long int», but argument 7 has type «long double*» [-Wformat]
pi.c:23:91: предупреждение: format «%ld» expects argument of type «long int», but argument 8 has type «long double*» [-Wformat]
Добавлено через 9 минут
изменил 1 строку

C++
1
 FILE* f = fopen(argv[1],"r+");
сейчас после запуска бинарника выдает это
Код
���4�(�$�(  ,-1076988404 ,3217978896 ,-1076988448 ,-1076988432oleg@ubuntu:~$
хотя жаль что первый вариант не сработал
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
11.12.2011, 16:54     Ошибка сегментации #4
Цитата Сообщение от mansp Посмотреть сообщение
да нет по поводу этого ничего не было
было
Цитата Сообщение от mansp Посмотреть сообщение
deprecated conversion from string constant to «char*»
Цитата Сообщение от mansp Посмотреть сообщение
хотя жаль что первый вариант не сработал
заведите отдельный буфер для конкатенации строк
mansp
18 / 18 / 0
Регистрация: 07.11.2010
Сообщений: 136
11.12.2011, 17:07  [ТС]     Ошибка сегментации #5
ещо один вопрос как сделать что бы мне выводились нормальные цыфри а не то что выводит у меня
когда я напрямую смотрю информацию о процесе
Код
cat /proc/1490/stat
1490 (pulseaudio) S 1 1489 1489 0 -1 4202560 2713 0 12 0 14 301 0 0 9 -11 3 0 3006 100052992 1435 4294967295 134512640 134588612 3217033200 3217032252 14570518 0 0 3674112 19011 4294967295 0 0 17 0 0 0 16 0 0
а при помощи моего кода должно вывести первые 7 чисел а выводятса непонятно что
Код
���4�(�$#� ,� ,-1074014500 ,3220952800 ,-1074014544 ,-1074014528
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
11.12.2011, 17:18     Ошибка сегментации #6
mansp,
во-первых нужны проверки:
1) fopen вернул не NULL
2) fscanf вернул 7 (число запрашиваемых параметров)

во-вторых вы зря игнорируете warnings

Цитата Сообщение от mansp Посмотреть сообщение
pi.c:23:91: предупреждение: format «%d» expects argument of type «int», but argument 2 has type «int*» [-Wformat]
компилятор явно говорит, что вы в printf вместо int'a пытаетесь передать int*
компилятор вам все ошибки нашел
mikillskegg
12 / 12 / 1
Регистрация: 31.10.2011
Сообщений: 35
11.12.2011, 20:56     Ошибка сегментации #7
1. Неправильно получаете адрес файла. Не мучайтесь с конкатенацией, попробуйте с sprintf
Код
char filename[20];
sprintf (filename, "/proc/%s/stat", argv[1]);
2. Вы открываете файл с параметром "r+". Этот параметр определяет, что файл открывается для чтения и записи. А писать в этот файл могут только привилегированные процессы, запускаемые от рута, поэтому открываться в таком виде данный файл не будет. Пишите просто
Код
FILE * f = fopen (filename, "r");
3. Неправильно передаете аргументы в printf, Передавать надо не адреса численных переменных, а их самих
Код
printf("%d ,%s ,%c ,%d ,%lu ,%lu ,%ld ,%ld",pid, comm, ........);
mansp
18 / 18 / 0
Регистрация: 07.11.2010
Сообщений: 136
13.12.2011, 14:24  [ТС]     Ошибка сегментации #8
я уже это исправил и изменил код но правильно считывает только первое значение тоесть пид процеса
хотя все типы данных куда я записываю соответствуют спецификации файла stat

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <fstream>
 
 
using namespace std;
 
int main(int argc, char* argv[])
{
    FILE* f = fopen(argv[1],"r");
    int pid;
    char comm [25];
    int ppid;
    int state;
    int pgrp;
    int session;
    int tty_nr ;
    int tpgid;
    long unsigned int flags;
    long unsigned int minflt;
    long unsigned int cminflt;
 
    fscanf(f,"%d ,%s, %d, %d, %d, %d, %d, %d, %lu, %lu, %lu",&pid, &comm[0], &ppid , &state, &pgrp, &session ,&tty_nr ,&tpgid, &flags, &minflt,&cminflt);
    printf("%d ,%s, %d, %d, %d,%d, %d, %d,%lu,%lu,%lu", pid, comm, ppid , state, pgrp, session ,tty_nr, tpgid, flags, minflt ,cminflt);
 
    return 0;
}
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
13.12.2011, 14:28     Ошибка сегментации #9
"%d ,%s, %c, %d, %lu, %lu, %ld, %ld,"
"1490 (pulseaudio) S 1 1489 1489 0"
если не секрет: где во второй строке запятые?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2011, 14:49     Ошибка сегментации
Еще ссылки по теме:

C++ Ошибка сегментации.
C++ ошибка сегментации
C++ Ошибка сегментации

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
mikillskegg
12 / 12 / 1
Регистрация: 31.10.2011
Сообщений: 35
13.12.2011, 14:49     Ошибка сегментации #10
В fscanf в строке уберите запятые
Yandex
Объявления
13.12.2011, 14:49     Ошибка сегментации
Ответ Создать тему
Опции темы

Текущее время: 21:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru