LINUX.ORG.RU

познать дзен popen()


0

2

не кидайте в меня табуретки,но этот код работает на виртуальной машине.А вот с реальной печалька выходит.

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

int main(int argc,char *argv[])
{
  char buf[400];
  FILE *cmdp,*cmdp1;
  int p,pl,flag=0;
  char res[256];

  if(argc!=2)
    {
      printf("USAGE: a.out<username>\n");
      exit(0);
    }
   strcpy(buf,"ps -u ");
   strcat(buf,argv[1]);
   strcat(buf," -ae o pid,stat | grep T ");
  cmdp=popen(buf,"r"); /*выводим список приостановленных процессов*/
  printf("%s",buf);
  if(!cmdp)
    {
      printf("pipelined error!\n");
      exit(0);
    }

  while(fgets(res,sizeof(res),cmdp))
    {
      flag=1;
      p=strspn(res,"\t\n");
      pl=strcspn((res+p),"\t\n");
      res[pl+p]=0;
      strcpy(buf,"kill -9");
      strcat(buf,res+p);
      printf("\n make ---- %s \n",buf);
      //  system(buf);
      cmdp1=popen(buf,"w");/*убиваем приостановленные процессы*/
    }
  if(flag==0){printf("No execute command\n");}
  pclose(cmdp);
  pclose(cmdp1);
  return(0);
}

с реальной печалька выходит

А, ну ты наверно при компиляции в CFLAGS забыл добавить -fno-pichal.

Давай выхлоп, что у тебя там не так (и что так на виртуалке).

DELIRIUM ☆☆☆☆☆
()

ОС то хоть одинаковые стоят ? Вывод может различаться.
Из за ошибок побочные эффекты, например cmdp1 ты в цикле присваиваешь, возможно много раз, а закрываешь один в конце.

ilovewindows ★★★★★
()
   strcpy(buf,"ps -u ");
   strcat(buf,argv[1]);
   strcat(buf," -ae o pid,stat | grep T ");

Не используйте эти функции. Они не контролируют выход за границы буфера. Используйте strncpy и strncat.

      printf("pipelined error!\n");
      exit(0);

Неразумно возвращать 0 при ошибке. Лучше EXIT_FAILURE.

  while(fgets(res,sizeof(res),cmdp))

Если будет прочитано ровно sizeof(res) байт, вы вылетите за пределы буфера.

akk ★★★★★
()

для начала у тебя дескрипторы в цикле текут. Что эта хрень делать то должна?

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

остановил mc и виртуалка сообщает :

bash-4.1# ./a.out root
ps -u root -ae o pid,stat | grep T 
 make ---- kill -9  PID STAT 

 make ---- kill -9 7749 T 
sh: line 0: kill: PID: arguments must be process or job IDs
sh: line 0: kill: STAT: arguments must be process or job IDs
sh: line 0: kill: T: arguments must be process or job IDs
[1]+  Killed                  mc
bash-4.1# 

он удаляет приостановленные процессы.

что сообщает норм машина написать не могу.арч обновился и шрифты в консоли слетели

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

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

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

Пропустил первую строчку
fgets(res,sizeof(res),cmdp);
while(fgets(res,sizeof(res),cmdp))
...


и закрываю cmdp1 сразу после выполнения

cmdp1=popen(buf,«w»);/*убиваем приостановленные процессы*/
pclose(cmdp1);


Вообщем работает.

ilovewindows ★★★★★
()

Пиши на баше, зачем тебе сишка, если ты так делаешь? Ну ок, не хочешь парсить proc руками — это еще можно понять, но не знать про man 2 kill — это п-ц.

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

Ну и в случае, если res был передан/возвращен из функции.

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

предоставь решение на баше и на с и обьясни препу - что он плохому учит

т.е атрофии выбора адекватного инструмента.

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

предмет - программирование на си. В этой лабе главное работа с процессами.Но в самом задании написано что надо использовать 2 процесса (1-на чтение с ps , 2-на запись т.е kill -9) так что я и в сомом коде немного не то написал,обидно. Но все равно интересно, как оно должно было выглядеть. Поэтому все нормально.

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