Как можно в функции узнать из какого процесса она была вызва
От: sonsen  
Дата: 23.12.08 01:25
Оценка:
Как можно в функции узнать из какого процесса она была вызвана. То есть существуют ли универсальные способы не зависимо от процессора и ОС получить такую информацию?

Насколько я знаю средствами языка это невозможно ...

23.12.08 14:14: Перенесено модератором из 'C/C++' — Кодт
Re: Как можно в функции узнать из какого процесса она была в
От: Erop Россия  
Дата: 23.12.08 01:42
Оценка: +1
Здравствуйте, sonsen, Вы писали:

S>Как можно в функции узнать из какого процесса она была вызвана. То есть существуют ли универсальные способы не зависимо от процессора и ОС получить такую информацию?


А что есть "процесс, вне зависимости от OS"?
Не пояснишь вопрос как-то по другому?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Как можно в функции узнать из какого процесса она была в
От: Кодт Россия  
Дата: 23.12.08 02:02
Оценка: :)
Здравствуйте, sonsen, Вы писали:

S>Как можно в функции узнать из какого процесса она была вызвана. То есть существуют ли универсальные способы не зависимо от процессора и ОС получить такую информацию?


А что тут узнавать? Из текущего!
Перекуём баги на фичи!
Re: Как можно в функции узнать из какого процесса она была в
От: Sealcon190 Соломоновы острова  
Дата: 23.12.08 02:11
Оценка:
Здравствуйте, sonsen, Вы писали:

S>Насколько я знаю средствами языка это невозможно ...


Что значит невозможно?
А передавать ID процесса в качестве параметра?
А использовать глобальную переменную?

Или ты что-то другое имеешь в виду?
Re: Как можно в функции узнать из какого процесса она была в
От: c-smile Канада http://terrainformatica.com
Дата: 23.12.08 02:28
Оценка: :)
Здравствуйте, sonsen, Вы писали:

S>Как можно в функции узнать из какого процесса она была вызвана. То есть существуют ли универсальные способы не зависимо от процессора и ОС получить такую информацию?


А что такое "процесс" в твоих терминах?

S>Насколько я знаю средствами языка это невозможно ...


Фигня, можно. Умельцы вон языком напряжение на батарейке с точностью до десятых вольта определяют.
Это конечно если тебе напряжение нужно определять. На батарейке.
Re[2]: Как можно в функции узнать из какого процесса она был
От: sonsen  
Дата: 23.12.08 04:42
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, sonsen, Вы писали:


S>>Как можно в функции узнать из какого процесса она была вызвана. То есть существуют ли универсальные способы не зависимо от процессора и ОС получить такую информацию?


E>А что есть "процесс, вне зависимости от OS"?

E>Не пояснишь вопрос как-то по другому?


Ну то есть есть ф-я Printf(); ее вызывают из двух thread ов, как в функции узнать из какого?


//main
int _tmain(int argc, _TCHAR* argv[])
{
    BOOL ulRet;
//    ulRet = OSAL_CreateSemaphore("AlarmSync", 1, &ulAppTmMgrAlarmSemId);

    /* Launch CheckKey thread to check for terminating keystroke. */
    _beginthread( CheckKey, 0, NULL );
    
    /* Launch NIC thread */
    _beginthread( NIC, 0, NULL );

    /* Launch UI thread */
    _beginthread( UI, 0, NULL );

    while (repeat)
    {
        printf("\nmain ...");
        Sleep( 1000L );
    }

    printf("\nEnd main ...");

    return 0;
}

/* CheckKey - Thread to wait for a keystroke, then clear repeat flag. */
void CheckKey( void *dummy )
{
    _getch();
    repeat = 0;    /* _endthread implied */
}


void NIC(void *)
{
    /* Loop until CheckKey terminates program. */
    while( repeat )
    {

        Printf("\nFrom NIC ...");
        /* Wait one second between loops. */
        Sleep( 1000L );
    }
     printf("\nEnd NIC ...");
    /* _endthread given to terminate */
    _endthread();
}

void UI(void *)
{
    /* Loop until CheckKey terminates program. */
    while( repeat )
    {

        Printf("\nFrom UI ...");

     /* Wait one second between loops. */
     Sleep( 1000L );
    }

    printf("\nEnd UI ...");
    /* _endthread given to terminate */
    _endthread();
}

void Printf(char *pointerToStr)
{
    //кто же меня вызвал?
}


То есть я конечно знаю что есть процесс который порождает потоки и т.д., но это что касается Unix, Windows. В RTOS же существуют только задачи(tasks,процессы) и вот по стэку, я могу докопаться какая задача вызвала эту ф-ю. Но универсального способа как я понял нет, все привязывается к архитектуре процессора и ОС в которой запущена программа ...
Re[2]: Как можно в функции узнать из какого процесса она был
От: sonsen  
Дата: 23.12.08 04:44
Оценка:
Здравствуйте, Sealcon190, Вы писали:

S>Здравствуйте, sonsen, Вы писали:


S>>Насколько я знаю средствами языка это невозможно ...


S>Что значит невозможно?

S>А передавать ID процесса в качестве параметра?
S>А использовать глобальную переменную?

S>Или ты что-то другое имеешь в виду?


Хотелось бы не изменяя параметров ф-ии, что нибудь типа макроса
Re[2]: Как можно в функции узнать из какого процесса она был
От: sonsen  
Дата: 23.12.08 04:47
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, sonsen, Вы писали:


S>>Как можно в функции узнать из какого процесса она была вызвана. То есть существуют ли универсальные способы не зависимо от процессора и ОС получить такую информацию?


CS>А что такое "процесс" в твоих терминах?


S>>Насколько я знаю средствами языка это невозможно ...


CS>Фигня, можно. Умельцы вон языком напряжение на батарейке с точностью до десятых вольта определяют.

CS>Это конечно если тебе напряжение нужно определять. На батарейке.

Хочу чтобы в логе был автопринт ф-ии с названием процесса (потока) который ее вызвал, причем чтобы печаталось независимо от ОС и процессора
Re[3]: Как можно в функции узнать из какого процесса она был
От: _Hooter Россия  
Дата: 23.12.08 08:06
Оценка:
Здравствуйте, sonsen, Вы писали:

S>Хочу чтобы в логе был автопринт ф-ии с названием процесса (потока) который ее вызвал, причем чтобы печаталось независимо от ОС и процессора


1) Текущий поток или идентификатор на него можно легко получить в любом месте программы:

HANDLE WINAPI GetCurrentThread(void);
DWORD WINAPI GetCurrentThreadId(void);


То есть, чтобы в твоей функции Printf узнать из какого потока она вызвана, нужно просто вызвать GetCurrentThreadId и получить идентификатор потока.

Это, конечно, не название функции и не "название потока", но используя эти данные, можно организовать глобальную карту соответствий идентификаторов и названий, так как идентификаторы потоков уникальны. Это если тебе действительно нужно знать имя. Для других ОС, в которых есть потоки, есть функции, выполняющие аналигичные действия.

Этот способ может решить твою задачу?

Кстати, не очень понятно, что ты имеешь в виду под названием потока или процесса.


2) Как я понимаю, тебе хочется создать некий универсальный код, который бы работал на любой операционной системе. Тут придется либо использовать уже готовые решения, либо создать такое решение самому. Другого способа не существует.

Например, ты используешь функцию beginthread, которая есть только в Win32 API. В ОС UNIX, например, такой функции нет. Соответственно, такой код будет работать только под Windows. То есть нужна еще какая-то платформонезависимая функция, которая бы запускала потоки. И т.д.
Re: Как можно в функции узнать из какого процесса она была в
От: Afonya1  
Дата: 23.12.08 10:04
Оценка:
Здравствуйте, sonsen, Вы писали:

S>Как можно в функции узнать из какого процесса она была вызвана. То есть существуют ли универсальные способы не зависимо от процессора и ОС получить такую информацию?


argv[0]
Re[3]: Как можно в функции узнать из какого процесса она был
От: Кодт Россия  
Дата: 23.12.08 11:57
Оценка:
Здравствуйте, sonsen, Вы писали:

S>Хочу чтобы в логе был автопринт ф-ии с названием процесса (потока) который ее вызвал, причем чтобы печаталось независимо от ОС и процессора


Тебе нужно не независимое, а переносимое решение.
Заточи его под те ОС, на которых ты собираешься запускать свою программу.
По-видимому, это будут всяческие никсы (включая мак) и виндоузы (NT и CE). Для остальных можно сделать заглушку, ибо вотще.
То есть, нужно поддержать pthreads и winthreads, и этого будет в общем достаточно.

В принципе, boost log (http://torjo.com) умеет выводить thread id.
А вот сваливать в один лог работу нескольких процессов — это увлекательное дело, и, боюсь, совсем не простое.
Проще всего, если этим будет заниматься отдельный процесс — демон или сервис. А уж он идентифицировать своих клиентов должен как-нибудь сам.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[3]: Как можно в функции узнать из какого процесса она был
От: Аноним  
Дата: 23.12.08 12:11
Оценка:
S>>>Как можно в функции узнать из какого процесса она была вызвана. То есть существуют ли универсальные способы не зависимо от процессора и ОС получить такую информацию?
E>>А что есть "процесс, вне зависимости от OS"?
E>>Не пояснишь вопрос как-то по другому?
S>Ну то есть есть ф-я Printf(); ее вызывают из двух thread ов, как в функции узнать из какого?
Понятие процесс и thread существуют далеко не во всех ос, и в некоторых ос могут значительно отличаться по своему смыслу и характеристикам. Потому ОС-независимых решений быть не может.
Re: Как можно в функции узнать из какого процесса она была в
От: MasterZiv СССР  
Дата: 24.12.08 06:46
Оценка:
sonsen пишет:

> Насколько я знаю средствами языка это невозможно ...

Нет, не возможно. И даже не средствами языка.
И в общем-то, потому что С/С++ может быть на системах,
где понятия процесса нет вообще.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Как можно в функции узнать из какого процесса она был
От: MasterZiv СССР  
Дата: 24.12.08 06:52
Оценка:
sonsen пишет:

> Хочу чтобы в логе был автопринт ф-ии с названием процесса (потока)

> который ее вызвал, причем чтобы печаталось независимо от ОС и процессора

На самом деле это вовсе и не
связано с потоком, а это у тебя имя некоего контекста, в котором
происходит работа. Ты вполне возможно захочешь его менять и независимо
от смены потока/процесса.

Передавай в параметрах в функцию. Неудобно — можно завуалировать макросом.

Другой подход — хранить имя потока в глобальной переменной, или
в глобальном стеке переменных, но тут тебе нужно будет решать
два вопроса (один из двух).
-- как разместить эти переменные в локальной памяти потока/процесса
-- или как синхоронизировать доступ к ним и идентифицировать поток/процесс

И то, и другое — платформозависимо.
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.