加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

测试我的程序是否从bash / ksh / csh命令行执行

发布时间:2020-12-15 22:35:02 所属栏目:安全 来源:网络整理
导读:我想知道我的程序是从命令行执行,还是通过system()调用或脚本执行. 我最初想过获取父id(getppid()),并查找/ proc / #ppppid目录检查exe链接或cmdline文件的内容.如果它是/ bin / bash,或/ bin / csh,或/ bin / sh,我会知道它是从命令行运行的. 问题是它不是
我想知道我的程序是从命令行执行,还是通过system()调用或脚本执行.

我最初想过获取父id(getppid()),并查找/ proc / #ppppid目录检查exe链接或cmdline文件的内容.如果它是/ bin / bash,或/ bin / csh,或/ bin / sh,我会知道它是从命令行运行的.

问题是它不是真的,因为一个独立的脚本也会告诉我/ bin / bash.
即使它工作,它可能是非常具体的Linux版本方法,并可能在未来停止工作.

有没有更好的方法呢?

感谢您提出任何建议或指出某些方向.

解决方法

自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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读