Linux: учитывая идентификатор, чтобы проверить, является ли его PID или TID в C

Вам будет предоставлен идентификатор в качестве входных данных для процесса. Нам нужно найти, является ли это PID или TID. Этот идентификатор может относиться к любому процессу, не обязательно к тому же процессу. Например:

.\a.out 1234

Вывод: идентификатор потока.

Мне нужно получить ту же информацию, что и моя программа. Если я сделаю

ps -elf | 1234 

в нем будут перечислены все записи с заданным идентификатором. Запись с PID и TID одинаковы, это процесс, а если они разные, то это поток. Я хочу сделать то же самое через программу C


person Piyush    schedule 23.10.2012    source источник
comment
Что вы пробовали? Где твоя работа? Вы читали Как задать вопрос? Как насчет часто задаваемых вопросов?   -  person John Szakmeister    schedule 23.10.2012
comment
Ваш вопрос неверен: узнайте о PID и TID здесь: stackoverflow .com/questions/4517301/   -  person Grijesh Chauhan    schedule 23.10.2012
comment
Я знаю, что могу получить PID и TID с помощью команды «ps». Мне нужно получить ту же информацию, что и моя программа. Если я сделаю ps -elf | 1234 будут перечислены все записи с заданным идентификатором. Тот, у кого PID и TID одинаковы, - это процесс, а если они разные, то это поток. Я хочу сделать то же самое через программу C. Любая идея, как я могу сделать?   -  person Piyush    schedule 23.10.2012
comment
Вы можете проверить, как они это делают: procps.sourceforge.net   -  person alk    schedule 23.10.2012
comment
Поскольку это можно легко сделать, выполнив поиск в файловой системе /proc процесса первого уровня или записи потока второго уровня (для процессов, принадлежащих одному и тому же пользователю или суперпользователю), кажется, что это еще один случай закрытия вопроса людьми, которые просто не разбираюсь в теме.   -  person Chris Stratton    schedule 23.10.2012
comment
В частности, для процесса /proc/pid будет существовать и иметь запись в каталоге (не будет отображаться в ls /proc). Для потока /proc/tid будет существовать, но не будет иметь записи в каталоге; у него будет запись в каталоге /proc/pid/task/tid. Это, конечно, касается сущностей, известных ядру; некоторые реализации многопоточности пользовательского пространства создают дополнительные виртуальные потоки.   -  person Chris Stratton    schedule 23.10.2012
comment
Чтобы попробовать это из командной строки, найдите /proc -name SOME_PID 2› /dev/null   -  person Chris Stratton    schedule 24.10.2012


Ответы (2)


PID и TID являются числовыми (идентификаторами). Как бы вы различали? В однопоточном коде и PID, и TID одинаковы.

person Grijesh Chauhan    schedule 23.10.2012

Лучшее, что вы можете сделать, это свериться с вашим текущим потоком или процессом. Используйте getpid() для получения текущего идентификатора процесса, если он совпадает с заданным pid, это, очевидно, идентификатор процесса.

pthread_self() возвращает идентификатор текущего потока.

Однако это было бы бесполезно, если бы оно могло принадлежать другому процессу или потоку.

Это для потоков POSIX и API процесса fork.

РЕДАКТИРОВАТЬ: @Chris предположил, что файловую систему proc можно исследовать для других идентификаторов процессов и потоков. Однако может потребоваться привилегированный доступ. Подробности в комментариях под вопросом

person fkl    schedule 23.10.2012
comment
Нет, нельзя ограничиваться проверкой информации о потоках в одном и том же процессе, хотя информация о процессах, принадлежащих другим пользователям, может быть недоступна. - person Chris Stratton; 23.10.2012
comment
Ваш комментарий расплывчатый, и я не совсем понимаю его. Все, что я сказал, это то, что, поскольку вы знаете свой собственный идентификатор процесса и идентификатор потока, если это один из них, вы можете сказать, был ли это идентификатор pid или потока. Что не так с этим? Когда кто-то возражает против ответа, вы должны дать более подробную информацию о своем мнении, какой-то API ref, код и т. Д. Или указать на какой-то стандарт, который лучше помогает решить проблему. - person fkl; 23.10.2012
comment
Вы сказали, что лучшее, что можно сделать, это проверить текущий поток или процесс. Это далеко не лучшее, что можно сделать, поскольку оно ограничивается проверкой частей текущего процесса, в то время как в вопросе конкретно указывается, что число может принадлежать любому процессу. Напротив, используя файловую систему /proc, вы можете как минимум проверять потоки любого процесса, принадлежащего пользователю, и, возможно, любого процесса, принадлежащего любому пользователю. - person Chris Stratton; 24.10.2012
comment
Согласен, но гарантировано ли это? Я считаю, что не всегда возможно получить доступ к pid и tid других, как вы упомянули. Так разве это не гарантирует, что вы сможете проверить только свои собственные? а все остальное на всякий случай. Во-вторых, я не уверен, смогу ли я отличить идентификаторы процессов от tids при проверке proc. Можете ли вы уточнить, как это сделать? - person fkl; 24.10.2012