测试我的程序是否从bash / ksh / csh命令行执行
我想知道我的程序是从命令行执行,还是通过system()调用或脚本执行.
我最初想过获取父id(getppid()),并查找/ proc / #ppppid目录检查exe链接或cmdline文件的内容.如果它是/ bin / bash,或/ bin / csh,或/ bin / sh,我会知道它是从命令行运行的. 问题是它不是真的,因为一个独立的脚本也会告诉我/ bin / bash. 有没有更好的方法呢? 感谢您提出任何建议或指出某些方向. 解决方法
自1980年以来编写的大多数shell都支持作业控制,这是通过在一个命令管道中为每个进程分配一个进程组来实现的.进程组由
setpgrp()设置,它将进程的pgrp设置为其pid.
pgrp是在forks中继承的. 因此,如果你的shell是一个相对现代的shell,由交互式shell启动的程序将具有getpid()== getpgrp(),以及该进程分叉的任何其他进程(例如,如果它是shell脚本或者它是否调用系统())将有getpid()!= getpgrp(). 这是一个测试程序,它在bash下的行为(它在ksh93和tcsh下也会表现相同): pp.c #include <unistd.h> #include <stdio.h> main() { printf("pid=%d pgrp=%dn",(int)getpid(),(int)getpgrp()); } $./pp pid=3164 pgrp=3164 $./pp & [1] 3165 $pid=3165 pgrp=3165 在管道中,最左边的命令是进程组负责人. (这没有记录,但是bash,ksh93和tcsh都是这样做的). $ls|./pp pid=3179 pgrp=3178 $./pp|cat pid=3180 pgrp=3180 使用system()调用的程序将具有与其父级相同的pgrp: pps.c #include <stdlib.h> main() { system("./pp"); } $./pps pid=4610 pgrp=4608 在shell脚本中,shell是进程组负责人,由它调用的任何命令都将继承pgrp: pp.sh #!/bin/sh ./pp $./pp.sh pid=4501 pgrp=4500 但是如果shell脚本执行程序,则pid不会更改,并且执行的程序将成为进程组负责人,因此您可能不希望这样做. ppe.sh #!/bin/sh exec ./pp $./ppe.sh pid=4504 pgrp=4504 在不太可能的情况下,用户关闭作业控制,每个命令将具有与shell相同的pgrp: $set +m $./pp pid=4521 pgrp=2990 $./pp pid=4522 pgrp=2990 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |