Bash:获取子进程名称



我是bash的新手。我有一个小代码:
bash.sh

./mama

mam.cpp

#include <stdlib.h>
int main()
{
system("./shvili");
while(1){}
}

shvili.cpp

int main()
{
while(1){}
}

如图所示,mamashvili进程的父进程。我遇到过这样的情况,我不知道子进程的确切名称。所以我的问题是,如何从c++中获得子进程的PID?(对我来说,得到流程的名称会更舒服)。

在"像这样的情况下,我不知道子进程的确切名称",但知道假定为唯一的父进程的名称,可以在基于psgrepsed(为较小的pid删除前导空格)、tr(将多个连续空格压缩为一个)和cut:的bash中使用至少通过bash进行检查的方法

$> cat foo_bar.sh 
#! /bin/bash
sleep 120
$> ./foo_bar.sh &
[1] 89239
$> ps -eo pid,ppid,args|grep -e " $(ps -eo pid,args| grep foo_bar.sh| grep -v grep| sed s/^ //g |cut -f 1 -d ' ') "|grep -v foo_bar.sh| sed s/^ //g | tr -s ' ' | cut -f 1,3 -d ' '
89241 sleep

因此,父进程的唯一名称用于确定父进程的pid:

$> ps -eo pid,args| grep foo_bar.sh| grep -v grep| sed s/^ //g |cut -f 1 -d ' '
89239

在子进程($(...))中评估的值用于从另一个ps调用中grep正确的行,以确定子进程和名称的查找pid(没有额外的参数,也没有子进程名称的先验知识)。

注意——在bash中,一些空格很重要——在搜索模式末尾添加的空格:

... grep " $(ps -eo pid,args| grep foo_bar.sh| grep -v grep| cut -f 1 -d ' ') " ...

这有助于避免误报,比如当父pid为123时,如果没有空格填充,这将与许多包含这些数字的pid相匹配,比如1234、12345、1123。。。

更新(对注释作出反应):如果父进程是a_mama(分叉出a_shvili子进程),并且它是机器上唯一具有该名称的进程,则以下操作应该有效:

$> p_proc="a_mama"
$> ps -eo pid,ppid,args|grep -e " $(ps -eo pid,args| grep ${p_proc}| grep -v grep| sed s/^ //g | cut -f 1 -d ' ') "|grep -v ${p_proc}| sed s/^ //g | tr -s ' ' | cut -f 1,3 -d ' '
12346 a_shvili

您可以尝试使用pidof来获取特定进程的pid。

示例

char line[LEN];
FILE *cmd = popen("pidof...", "r");
fgets(line, LEN, cmd);
pid_t pid = strtoul(line, NULL, 10);
pclose(cmd);

您确实知道子进程的名称——它是shvili,如何启动它却不知道它的名称。

如果你想知道孩子的PID,那么不要使用systemsystem不是一个行为良好的过程,请不要使用它。

使用forkexec:

在父do:

#include <unistd.h>
int child_pid = fork();
if (child_pid == -1) {
//fork failed do something about it
} else if (child_pid == 0) {
//this runs for child
execl("shvili", NULL);
//if you get here then exec errored
} else {
//This runs for parent
//child_pid has child pid
//Add parent code hear.
wait(…);
}

说明:

  • 如果fork出错,if的第一个分支将运行
  • 其他
    • 在两个独立的过程中:
    • 第二个分支为孩子运行
    • 并且第三分支为父分支运行

相关内容

  • 没有找到相关文章

最新更新