LINUX.ORG.RU

scandir


0

1

помогите написать код со scandir чтобы он выводил из заданной директории только те папки , имена которых состоят из цифр


Ответ на: комментарий от ttnl

char path[256];

Узнаю быдлокодера. Откуда вы такие криворукие беретесь?!

Смотри /usr/include/bits/dirent.h, я там вижу:

struct dirent
  {
#ifndef __USE_FILE_OFFSET64
    __ino_t d_ino;
    __off_t d_off;
#else
    __ino64_t d_ino;
    __off64_t d_off;
#endif
    unsigned short int d_reclen;
    unsigned char d_type;
    char d_name[256];           /* We must not include limits.h! */
  };

#ifdef __USE_LARGEFILE64
struct dirent64
  {
    __ino64_t d_ino;
    __off64_t d_off;
    unsigned short int d_reclen;
    unsigned char d_type;
    char d_name[256];           /* We must not include limits.h! */
  };
#endif
catap ★★★★★
()
Ответ на: комментарий от catap

а, все, туплю.

Нефиг было писать с утра.

Вместо 256 NAME_MAX, согласен.

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

Меняем cmdline на status, а strncmp на strstr. Ну и вместо поиска процессов, имеющих то же имя, что и наш, получаем имя из командной строки.

Да, забыл добавить: часть своего кода я «нагло спер» из исходников пакета procps :)

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

там столько всего , что ничего не понятно , а на каком сайте лежат все исходники?

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

такую программу я уже писал сейчас суть моего задания в другом , нужно считать строку и сравнить с заданной

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

До чего ж студенты ленивые пошли:

#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#define PROC_BASE "/proc"

void readname(char *name, pid_t pid){ // считать имя процесса из /proc/...
   char *pp = name, byte, path[256];
   int cntr = 0;
   FILE* file;
   sprintf(path, PROC_BASE "/%d/status", pid);
   file = fopen(path, "r");
   fgets(pp, 256, file);
   fclose(file);
}
int main(int argc, char **argv){
   DIR *dir;
   struct dirent *de;
   pid_t pid, self;
   char name[256], *name_ex;
   if (!(dir = opendir (PROC_BASE))){ // открываем директорию /proc
      perror (PROC_BASE);
      exit (1);
   }
   if(argc < 2) exit(1);
   name_ex = strdup(argv[1]);
   self = getpid(); // свой идентификатор
   while ((de = readdir (dir)) != NULL){ // пока не дойдем до конца директории
   // пропустим, если директория не указывает на процесс, или указывает на self
      if (!(pid = (pid_t) atoi (de->d_name)) || pid == self)
         continue;
      readname(name, pid); // считываем имя процесса
      if(strstr(name, name_ex)){ // если оно совпадает с self
         printf("\nFound running process (pid=%d)\n", pid);
/*         if(flag){
            WARN("killing\n");
            kill(pid, SIGQUIT); // убиваем, если flag != 0
         }
         else{
            WARN("exiting.\n");
            kill(pid, SIGUSR1);
            exit(0);
         }*/
      }
   }
   closedir(dir);
}

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

Да, в readname неплохо было бы сделать проверку - возможно ли вообще открыть файл, и возвращать число, а в main написать

if(!readname(name, pid)) continue;

Убивать найденный процесс, или не убивать - уж оставлю вам доделать... (комментарии убрать, flag - вводить из командной строки, в kill подумать, какой сигнал послать лучше).

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

спасибо , но мне нужно обязательно со scandir

suv121
() автор топика
Ответ на: комментарий от Eddy_Em
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include<dirent.h>
int isNum(const struct dirent *de){
  char *s = strdup(de->d_name), *ptr;
  ptr = s;
  int r;
  while (isdigit(*ptr)) ptr++;
  r = !*ptr;
  free(s);
  return r;
}

readname(int name,char* name2){
 char **pp=name2, byte, path[256];
 int c=0;
 FILE* f;
 sprintf(path,"/proc/%s/status", name);

f=fopen(path,"r");
 fgets(pp, 256, f);
fclose(f);
      }

int main(){
FILE* f;
char d;
char buf[100];
       int pid,n,i,c;
       char **names;
char way[60]="/proc";
struct dirent **namelist;
n = scandir(way, &namelist, isNum, alphasort);
if (n < 0){
perror("scandir");
          }
else {
names=(char**)malloc(n*sizeof(char*));
for(i=0;i<n;i++){
names[i] = strdup(namelist[i]->d_name);
free(namelist[i]);
                }
     }
free(namelist);

atoi(names);
for(i=0;i<n;i++){
printf("%s\n", names[i]);
                }


printf("\n enter 'Name: name procces' : ");

fgets(buf,sizeof(buf),stdin);
if(buf[strlen(buf)-1]=='\n'){
                            buf[strlen(buf)-1]='\0';
                            }
printf("pids procces with this name:");
for(i=0;i<n;i++){
openfile(names[i],way);
if(strstr(way,buf)){
                   printf("\npid=%d",names[i]);
                   }
else continue;
                }

pid=getpid();
printf("PID this programm:%d",pid);
for(i=0;;i++){
printf("\nenter Pid procces which need kill:");
scanf("%d",&pid);
kill(pid,SIGKILL);
printf("\n if that all press 1");
scanf("%d",&i);
if(i==1){break;}
else continue;
            }

free(names);
return 0;
}

вот что у меня получилось , только не компилируется)

suv121
() автор топика
Ответ на: комментарий от pozitiffcat
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include<dirent.h>
int isNum(const struct dirent *de){
  char *s = strdup(de->d_name), *ptr;
  ptr = s;
  int r;
  while (isdigit(*ptr)) ptr++;
  r = !*ptr;
  free(s);
  return r;
}

void readname(int name,char name2[60]){
 char *p=&name2[0], byte, path[256];
 int c=0;
 FILE* f;
 sprintf(path,"/proc/%s/status", name);

f=fopen(path,"r");
 fgets(p, 256, f);
fclose(f);
      }

int main(){
          int inames;
          char d;
          char buf[100];
          int pid,n,i,c;
          char **names;
          char way[60]="/proc";
          struct dirent **namelist;
n = scandir(way, &namelist, isNum, alphasort);
if (n < 0){
perror("scandir");
          }
else {
names=(char**)malloc(n*sizeof(char*));
for(i=0;i<n;i++){
names[i] = strdup(namelist[i]->d_name);
free(namelist[i]);
                }
     }
free(namelist);



printf("\n enter name procces : ");

fgets(buf,sizeof(buf),stdin);
if(buf[strlen(buf)-1]=='\n'){
                            buf[strlen(buf)-1]='\0';
                            }

printf("pids procces with this name:");

for(i=0;i<n;i++){
inames=atoi(names[i]);
readname(inames,way);
if(strstr(way,buf)){
                   printf("\npid=%d",inames);
                   }
else continue;
                }

pid=getpid();
printf("PID this programm:%d",pid);
for(i=0;;i++){
printf("\nenter Pid procces which need kill:");
scanf("%d",&pid);
kill(pid,SIGKILL);
printf("\n if that all press 1");
scanf("%d",&i);
if(i==1){break;}
else continue;
            }

free(names);
return 0;
}

все скомпилировалось , но теперь ошибка сегментации после ввода имени процесса

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

как исправить такую ошибку tmp/ccaORRNd.o: In function `main': kills.c:(.text+0x201): undefined reference to `sprint' collect2: ld returned 1 exit status

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

Вам точно scandir нужен? Чем мое решение не устраивает?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от suv121
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include<dirent.h>
int isNum(const struct dirent *de){
  char *s = strdup(de->d_name), *ptr;
  ptr = s;
  int r;
  while (isdigit(*ptr)) ptr++;
  r = !*ptr;
  free(s);
  return r;
}

void readname(char *name,char *name2){
 char *p=&name2[0], byte, path[256];
 int c=0;
 FILE* f;
 snprintf(path, 255, "/proc/%s/status", name);
f=fopen(path,"r");
 fgets(p, 256, f);
fclose(f);
      }

int main(int argc, char **argv){
          int inames;
          char d;
          char *buf;
          int pid,n,i,c;
          char **names;
          char way[256]="/proc";
          struct dirent **namelist;
if(argc < 2){
	fprintf(stderr, "\nusage: %s <process name>\n", argv[0]);
	exit(-1);
	}
buf = strdup(argv[1]);
n = scandir(way, &namelist, isNum, alphasort);
if (n < 0) perror("scandir");
else {
names=(char**)malloc(n*sizeof(char*));
for(i=0;i<n;i++){
names[i] = strdup(namelist[i]->d_name);
free(namelist[i]);
                }
     }
free(namelist);
printf("pids procces with name %s:", buf);

for(i=0;i<n;i++){
readname(names[i],way);
if(strstr(way,buf))  printf("\npid=%d",inames);
                }
pid=getpid();
printf("PID of this programm:%d",pid);
for(i=0;;i++){
printf("\nenter Pid procces which need kill:");
scanf("%d",&pid);
kill(pid,SIGKILL);
printf("\n if that all press 1");
scanf("%d",&i);
if(i==1)break;
            }
free(names);
return 0;
}

Только в этом коде еще остались дыры.

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

этот код я переделал не подскажите на каком сайте можно найти все исходники команд консоли?

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

Да, для начала (чтобы хотя бы разобраться в том, что здесь вам понаписали) почитайте Кернигана и Ритчи. Потом - посмотрите исходники procps, ну, а если еще какие консольные утилитки захочется посмотреть - coreutils смотрите .

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