Как узнать, работает ли моя программа на c внутри подоболочки?

Есть ли возможность узнать, работает ли моя программа, написанная на C, внутри подоболочки или в обычной оболочке?

Я хочу знать, потому что не могу приостановить его, когда он работает внутри подоболочки.


person aihya    schedule 17.09.2019    source источник
comment
возможно, вы можете следить за родительскими процессами до инициализации, и если вы найдете 2 оболочки, предположите, что они работают внутри подоболочки.   -  person pmg    schedule 17.09.2019
comment
Интересный вопрос ... не могли бы вы немного сосредоточиться на том, что бы вы сделали с этой информацией? Например. как бы ваша программа вела себя по-другому? (Может быть проблема XY)   -  person Daniel Jour    schedule 17.09.2019
comment
Когда вы говорите, что не можете его приостановить, как вы попытаетесь его приостановить? Вы проверили обработчики сигналов в своей программе (или, что более важно, какие сигналы игнорируются)? Некоторые сигналы управления заданиями нельзя игнорировать; другие могут, IIRC. Ваша программа всегда работает сама по себе, поэтому я предполагаю, что ваша проблема связана с тем, как она вызывается. Находится ли он внутри (…; your-program; …) суб-оболочки, или в some-prog | your-program | another-prog конвейере, или что-то в этом роде; и сам конвейер или суб-оболочка работает в фоновом режиме. Почему ты беспокоишься? Почему вам нужно приостановить вашу программу? И только твоя программа?   -  person Jonathan Leffler    schedule 18.09.2019
comment
@JonathanLeffler Видите ли, я учусь в школе программирования, и я обязан создать программу, которую можно приостанавливать и извлекать даже из подоболочки. Я делаю программу выбора элементов на основе терминала, которая, когда я запускаю ее, например, вот так: ls -la `./select *` , она дает мне сетку элементов для выбора.   -  person aihya    schedule 18.09.2019
comment
OK; правила школы правила. Но я понятия не имею, что вы пытаетесь сделать или с какими проблемами сталкиваетесь. В вопросе недостаточно информации, нет кода, и возможность приостановки и извлечения не имеет большого значения для меня (но, поскольку я занимаюсь программированием более 30 лет, проблема может быть в преждевременном окаменении). Я подозреваю, что вы говорите о контроле над работой. Попробуйте создать MCVE (минимальный, полный, проверяемый пример) (или MRE или любое другое имя, которое сейчас использует SO) или SSCCE ( Краткий, автономный, правильный пример).   -  person Jonathan Leffler    schedule 18.09.2019
comment
Если вы еще не поняли из-за отсутствия быстрого ответа и моих сбитых с толку комментариев, нет простого решения того, о чем вы спрашиваете на поверхности (как определить, работает ли программа в суб-оболочке ), не в последнюю очередь потому, что неясно, что вы подразумеваете под этой фразой.   -  person Jonathan Leffler    schedule 18.09.2019
comment
@JonathanLeffler stackoverflow.com/questions/57962161/   -  person aihya    schedule 18.09.2019
comment
OK; В другом вопросе гораздо больше контекста. Этот вопрос не стоит сам по себе. Скорее всего, вам нужно будет просмотреть группы процессов, сеансы, родительские идентификаторы, конфигурации обработки сигналов и т. Д., Чтобы сделать какое-то предположение о том, находится ли ваш процесс в какой-либо под-оболочке. Вы должны найти способ записывать различные аспекты процессов при прямом запуске и при запуске в нотации $(…) (предпочтительнее, чем обратные тики, но достаточно близко к тому же для простых контекстов). Я не понимаю, что запуск программы с подстановкой команд обычно считается вспомогательной оболочкой, но ...   -  person Jonathan Leffler    schedule 18.09.2019
comment
Вы можете улучшить этот вопрос, задав что-то вроде: Как процесс может определить, выполняется ли он как часть (или все) операции подстановки команд $(…), а не непосредственно из командной строки? нужно также посмотреть на стандартные каналы ввода / вывода - подстановка команд, вероятно, не будет идти на терминал, но ./program > file также не идет на терминал. Вот почему модели использования так важны. Я тоже не понимаю, чему вы должны учиться - внимательно посмотрите на свои классные заметки и упражнения. Вероятно, это не должно быть так сложно.   -  person Jonathan Leffler    schedule 18.09.2019
comment
aihya@e2r1p4 ~/Documents/1337/ft_select/src : echo `echo $ZSH_SUBSHELL` 1 aihya@e2r1p4 ~/Documents/1337/ft_select/src : echo $ZSH_SUBSHELL 0. Я думаю, что это возможно с zsh, потому что вы можете видеть, что он различает обычную оболочку и подоболочку. Проблема в том, что я могу получить его из основной функции, используя этот аргумент envp, потому что он получает только глобальные переменные, а не локальные.   -  person aihya    schedule 18.09.2019
comment
Я также не уверен, что оболочка (Bash или что-то еще) думает, что control-Z должен посылать сигнал процессу в операции подстановки команд. Возможно нет; вот почему нажатие Ctrl-Z не работает. Можете ли вы отправить SIGTSTP или что-то еще напрямую через kill? Почему вы записываете вывод программы через $(…)?   -  person Jonathan Leffler    schedule 18.09.2019
comment
Вы используете zsh? Если это так, я ухожу отсюда - я не использовал его и очень мало о нем знаю, особенно о том, как он обрабатывает подстановку команд, сигналы и управление заданиями.   -  person Jonathan Leffler    schedule 18.09.2019
comment
Спасибо. Я думаю, моя репутация упала хх.   -  person aihya    schedule 18.09.2019