在c或c ++中是否有像su​​bprocess.getoutput()这样的函数或方法?

时间:2017-12-20 15:10:12

标签: c++ c python-3.x

的Python:

print("Active Device:"+subprocess.getoutput("ip link|grep \"state UP\"|cut -d : -f 2|cut -d \' \' -f2"))

通过这样做我可以在c中得到像That那样的输出吗? C:

printf("Active Device:%s",getsystemoutput("ip link|grep \"state UP\"|cut -d : -f 2|cut -d \' \' -f2"));

2 个答案:

答案 0 :(得分:0)

函数getsystemoutput()可能如下所示:

char *getsystemoutput( char *cmd )
{
    static char output[1024];

    FILE *fp;

    if( (fp = popen( cmd, "r" )) == NULL )
        return "";

    if( fgets( outout, sizeof output, fp ) == NULL )
        strcpy( output, "" );

    pclose( fp );
    return output;
}

此版本在出现错误时返回一个空字符串,并使用静态缓冲区进行输出,这使得它在printf()中很容易使用,但出于一般目的,我建议在错误时返回NULL并传递{{ 1}} +它的大小作为参数。您可能还需要检查output的结果以确定所调用命令的退出状态。请注意,如果没有循环,它将只返回第一行输出。

答案 1 :(得分:0)

标准C没有运行外部进程的功能,收集其标准输出和标准错误,并将其作为字符串返回。实际上,作为一个策略问题,标准C不提供返回动态分配内存的函数,除了函数之外,这个函数除了将其分配内存作为其明确目的之外,还需要这样做。

在POSIX环境中,您可以依靠popen()提供FILE *,通过该FILE *file = popen("ip link | grep 'state UP' | cut -d : -f 2 | cut -d ' ' -f2", "r")); if (file == NULL) { // handle error } 可以读取shell命令的标准输出:

fgets()

然后你必须自己处理输出;也许是通过char buffer[LARGE_ENOUGH]; // Read one line from the input (or part of one, if the buffer is too small) if (fgets(buffer, sizeof(buffer), file) == NULL) { // handle error } // If a newline was read then it will be included buffer[strcspn(buffer, "\n")] = '\0';

printf("Active Device:%s", buffer);

您可以打印结果:

popen()

请注意,必须使用pclose()

关闭使用if (pclose(file) != 0) { // handle error } 打开的文件
FILE *file = popen(
        "{ ip link | grep 'state UP' | cut -d : -f 2 | cut -d ' ' -f2; } 2>&1",
        "r"));

顺便说一下,如果你想捕获stderr以及标准输出,就像Python版本那样,那么最好的办法就是通过命令中的I / O重定向来适应它,例如:

takePhotoBtn.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v) {
                    TakePhoto();
        }
    });

private void TakePhoto() {
    Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File imagepath = new File(getFilesDir(), "images");
    File newFile = new File(imagepath, ".jpg");
    if (newFile.exists()) {
        newFile.delete();
    }else {
        newFile.getParentFile().mkdir();
    }
    selectedPhotoPath = getUriForFile(this, BuildConfig.APPLICATION_ID + ".fileprovider", newFile);

startActivityForResult(captureIntent, TAKE_PHOTO_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == TAKE_PHOTO_REQUEST_CODE && resultCode == RESULT_OK) {
            InputStream inputStream;
            try {
                inputStream = getContentResolver().openInputStream(selectedPhotoPath);
                bundle = new Bundle();
                bundle.putParcelable(KEY_BITMAP, selectedPhotoPath);
            }catch (FileNotFoundException e) {
                e.printStackTrace();
                Toast.makeText(this, "Unable to open image", Toast.LENGTH_LONG).show();
            }
        }
    Intent intent = new Intent(this, Activity.class);
    intent.putExtras(bundle);
    startActivity(intent);
handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            TakePhoto();
            handler.postDelayed(this, 10000);
        }
    },10000);    
}