系统($BASHPID)的C函数不工作
我在Ubuntu 12.04中使用system()函数用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
#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);