系统($BASHPID)的C函数不工作

系统($BASHPID)的C函数不工作,c,linux,process,C,Linux,Process,我在Ubuntu 12.04中使用system()函数用C编写了一个简单的程序,如下所示: #include <stdio.h> #include <unistd.h> int main() { printf("getpid() = %d\n", getpid()); printf("getppid() = %d\n", getppid()); printf("cmd process ID:\n"); system("echo $BAS

我在Ubuntu 12.04中使用system()函数用C编写了一个简单的程序,如下所示:

#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("getpid() = %d\n", getpid());
    printf("getppid() = %d\n", getppid());
    printf("cmd process ID:\n");

    system("echo $BASHPID");
    return 0;
}
      execl("/bin/sh", "sh". "-c", command, (char *) 0);

我的问题是,函数系统(“echo$BASHPID”)不会给出任何东西。当我尝试使用一些常用命令时,比如date,它在运行可执行文件时在终端中给出。只有上述情况没有给出正确的结果。可能的解释是什么?我对C编程中的Linux进程和系统调用知之甚少。任何见解都将有助于我进一步的探索。谢谢。

系统
正常运行
/bin/sh
,可能不会设置
$BASHPID
。尝试使用:

system("/bin/bash -c 'echo $BASHPID'")
注意,这总是只打印
系统调用的子bash进程的PID,这不是很有用。看起来您正在尝试获取父bash进程的PID,这将无法工作,因为在键入时,父bash的
BASHPID
变量未导出

/bin/sh -c 'echo $BASHPID'

将在命令行上演示。

要在C程序中检索环境变量,请使用

因此,如果您认为您的程序是在设置了
BASHPID
的环境中运行的(即在bash中导出
-ed),请尝试:

但是,shell通常是父进程,您可以使用它进行查询。或者是流程组长,请参见

如果希望获得某个命令的输出,请使用,例如

但这可能不会像您希望的那样工作,因为
popen
system
可能是
/bin/sh
,这可能是
bash
;也许你应该
echo$$

另外,特定于
bash
。我的交互式(登录)shell不可用,因此不会设置它

请注意,通常应在任何分叉函数(如
popen
system
之前调用(例如
fflush(NULL);
..),以确保刷新stdio缓冲区

附录 如果您想知道是否正在创建其他流程,请阅读其文档:

system()库函数使用fork(2)创建子进程 使用execl(3)执行命令中指定的shell命令 详情如下:

#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("getpid() = %d\n", getpid());
    printf("getppid() = %d\n", getppid());
    printf("cmd process ID:\n");

    system("echo $BASHPID");
    return 0;
}
      execl("/bin/sh", "sh". "-c", command, (char *) 0);
命令完成后,system()返回

但是,如果将
NULL
参数传递给
system
,则会出现一种特殊情况:

若命令为NULL,则system()返回一个状态,指示 系统上有一个shell


另外,研究一些实现的源代码,例如从

如果我按照您的建议更改上述代码,它将为每种情况提供不同的PID。我是否在这里使用了3个进程,其中包括shell?如果是,那么/bin/bash将生成任何不同的进程?好吧,system()启动一个新进程,因此它们可能会得到不同的PID。由于C程序没有导出,所以不会将PID发送到C程序(据我所知),您到底问什么?我想从C程序中检索
BASHPID
是实现您的目标的错误方法。@BasileStrynkevich,我需要知道system()是否真的会创建一个不同的进程,而不仅仅是知道它的进程id。要获取shell的进程id,使用
echo$$
,它更便于携带,并且不是特定于bash的。
      execl("/bin/sh", "sh". "-c", command, (char *) 0);