LINUX.ORG.RU

Ошибка при компиляции

 


0

1

Есть программа:

#include <iostream>

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

#include <stdio.h>

#include <dirent.h>

#include <string.h>

#include <stdlib.h>

#include <sys/time.h>

#include <sys/resource.h>

#include <sys/syscall.h>

#include <pthread.h>

#include <cstdio>



using namespace std;



void* procInfo(void*);

mode_t readUmasl();

int cntOpenFiles();

void printArgv();

void printCodDataStackEnvSegment();



char** argvG;

int argcG;

extern char** environ;



int main(int argc, char** argv)

{

  argvG =  (char**)malloc(argc*sizeof(char*));

  memcpy(argvG, argv, argc*sizeof(char*));

  argcG = argc;

  procInfo(NULL);

  if(!fork())

  {

//printf("-------------------CHILD_PROC-------------------\n");  

  cout << "-------------CHILD PROCESS-------------" << "\n";

    procInfo(NULL);

  }

  wait();

  pthread_t thread_id;

//printf("------------------IN_THREAD-----------------\n"); 

 cout << "-------------IN THREAD-------------"<< "\n";

  pthread_create(&thread_id, NULL, procInfo, NULL);

  pthread_join(thread_id, NULL);

  pause();

return 0;

pause();

}



void* procInfo(void* data )

{

  cout << "PID: " << getpid() << "\n";

  cout << "PPID: " << getppid() << "\n";

  cout << "UID: " << getuid() << "\n";

  cout << "GID: " << getgid() << "\n";

  cout << "SID: " << getsid(getpid()) << "\n";

  cout << "PGID: " << getpgid(getpid()) << "\n";

  cout << "UMASK: "<< readUmasl() << "\n";

  cout <<"Control terminal:";

  if(isatty(0))

      cout << ttyname(0);

  else

      cout <<"closed";

  cout <<"\n";

  char buff[256];

  getcwd(buff, 256);

  cout << "Current directory: " <<buff<< "\n";

  cout << "count open files: " << cntOpenFiles() << "\n";

  cout << "Priority: " <<  getpriority(PRIO_PROCESS, getpid());



  printf("\n-------------------Priority-------------------\n");

  setpriority(PRIO_PROCESS, getpid(),5);

  cout << "Priority: " <<  getpriority(PRIO_PROCESS, getpid());

  printArgv();

  printCodDataStackEnvSegment();

  return NULL;

}



mode_t readUmasl()

{

  mode_t mask = umask(0);

  umask(mask);

  return mask;

}



int cntOpenFiles()

{

  char buff[256];

  sprintf(buff,"/proc/%i/fd",getpid());

  DIR *dir = opendir(buff);

  

  int i=0;

  dirent* entry;

  while((entry = readdir(dir))!=NULL)

  {

     ++i;

  }

  closedir(dir);

  i -= 3; 

  return i;

}



void printArgv()

{

  for(int i=0; i <argcG; i++)

  {

      cout << argvG[i];

  }

  cout << "\n";

}



void printCodDataStackEnvSegment()

{

  // Cod segment 1

  char buffer[256];

  sprintf(buffer, "/proc/%i/maps", getpid());

  FILE *map = fopen(buffer, "r");

  fgets(buffer,256,map);

  char *pCodSegStart = strtok(buffer, "-");

  char *pCodSegEnd = strtok(NULL, " ");

  cout << "Code segment: " << pCodSegStart <<" " << pCodSegEnd << "\n";

  // Data segment 3

  char buffer1[256];

  fgets(buffer1,256,map);

  fgets(buffer1,256,map);

  char *pDataStart = strtok(buffer1, "-");

  char *pDataEnd = strtok(NULL, " ");

  cout << "Data segment: " << pDataStart <<" " << pDataEnd<< "\n";

  fclose(map);

  // Stack segment 3 с конца

  if (syscall(SYS_gettid) == getpid())

  {

    cout << "in main thread \n";

    char buff[256];

    sprintf(buff, "/proc/%i/maps", getpid());

    map = fopen(buff, "r");

    int i = 0;

    while(fgets(buff,256,map) != NULL){

	    ++i;

    }

    rewind(map);

    int j = 0;

    for (; j != i - 2; ++j ){

	    fgets(buff, 256, map);

    }

    fclose(map);

    char *pStackStart = strtok(buff, "-");

    char *pStackFinish = strtok(NULL, " ");

    cout << "Stack segment: " << pStackStart <<" " << pStackFinish<< "\n";

  }

  else

  {

    void *addr;

    size_t size;

    pthread_t self;

    pthread_attr_t attr;

    

    self = pthread_self();

    pthread_getattr_np(self, &attr);

    pthread_attr_getstackaddr(&attr, &addr);

    pthread_attr_getstacksize(&attr, &size);

    

    cout << "in non main thread now \n";

   

    printf("stack addr = %0lx\n", addr);

    printf("stack addr = %0lx\n", addr-size);



  }

  

  // Env segment

  cout << "Enviroment segment: "<< environ[0] << " ";

  int i = 0;

  while(environ[i + 1] != NULL) {

	  ++i;

  }

  cout <<  environ[i] + strlen(environ[i]) + 1 << "\n";

}

Делаю gcc program.c - получаю ошибку «program.c:1:20: fatal error: iostream: No such file or directory #include <iostream> ^ compilation terminated.»

В чем причина?

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

Читать же надо, как что использовать, а не копировать и пытаться собрать в последний момент... Ошибки линкера, я полагаю:

g++ program.cpp -pthread

xaizek ★★★★★ ()

argvG = (char**)malloc(argc*sizeof(char*));

Не делай так никогда, пожалуйста

Deleted ()

Не пиши на суржике - это ни к чему хорошему не приведёт. Толи на том, толи на том - не надо смешивать.

fornlr ★★★★★ ()
Последнее исправление: fornlr (всего исправлений: 1)

Нужно добавить еще переводов между строками. Иначе квест слишком легкий получается.

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

Это C++, поэтому надо использовать g++

Не надо. GCC по расширению файла определит, C это, или C++. В конце концов, можно подсунуть GCC опцию -x lang, где lang — либо c, либо c++, что позволит явно указать, на каком языке пишут в этом файле.

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

Да что ты говоришь?

gcc test.cpp -o test
/tmp/ccUUy14G.o:test.cpp:function main: error: undefined reference to 'std::cout'
/tmp/ccUUy14G.o:test.cpp:function main: error: undefined reference to 'std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/tmp/ccUUy14G.o:test.cpp:function __static_initialization_and_destruction_0(int, int): error: undefined reference to 'std::ios_base::Init::Init()'
/tmp/ccUUy14G.o:test.cpp:function __static_initialization_and_destruction_0(int, int): error: undefined reference to 'std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status

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

Я не знаю, что за скрипт линкера у твоего GCC, что он не подхватывает std::cout и прочие iostreams при компиляции плюсовой программы (пусть даже в ней густо насыпано сишного кода).

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

собирается если добавить -lstdc++

Это понятно, непонятно, отчего её по умолчанию не применяет линкер(при сборке с помощью GNU C Compiler).

Вы откуда такие беретесь?

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

Это понятно, непонятно, отчего её по умолчанию не применяет линкер(при сборке с помощью GNU C Compiler)

Вы откуда такие беретесь?

GCC, the GNU Compiler Collection — ты в каком году в криокамеру залёг?

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