的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"));
答案 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);
}