【问题标题】:Cannot call Linux command using system function in c无法使用c中的系统函数调用Linux命令
【发布时间】:2015-11-30 06:12:22
【问题描述】:

我想用system()函数执行下面的命令,

awk -F [][] '/dB/ { print $2 }' <(amixer sget Master) > sound_level

当我在终端中写入时,它会为我提供所需的输出。 但是当我用 C 中的系统函数调用这个命令时,它给了我错误。

我的代码是:

#include<stdio.h>
#include <stdlib.h>

int main()
{
        system("awk -F [][] '/dB/ { print $2 }' <(amixer sget Master) > sound_level");
        return 0;
}

它给了我以下错误:

sh: 1: Syntax error: "(" unexpected

我也试过了:

awk -F [][] '/dB/ { print $2 }' < /(amixer sget Master /) > sound_level

但它不起作用。

感谢任何帮助。

【问题讨论】:

  • 在程序中显示您尝试使用它的代码。 system 电话
  • system("awk -F [][] '/dB/ { print $2 }' sound_level");
  • 顺便说一句:system() 函数与系统调用不同。
  • Ulrich Eckhardt 谢谢你的建议。我已经编辑了这个问题。
  • 关于代码,请编辑您的问题以包含完整的main() 函数,但实际上去掉了重现问题所不需要的所有内容。您在此处显示的任何内容都不是导致错误的原因。

标签: c linux


【解决方案1】:

阅读system(3)。那个 C 函数(你可能应该避免,更喜欢显式的 syscalls(2)forkexecve)正在运行 POSIX /bin/sh -c ;另请阅读popen(3)

但是您的交互式 shell 可能是 bash,它的行为与 POSIX sh 不同,尤其是对于像 &lt;(amixer sget Master) 这样的重定向

为了让事情变得更复杂,/bin/bash 程序,当以sh 调用时,会将其行为更改为 POSIX sh,因此在许多系统上,/bin/sh 是指向/bin/bash ...

请阅读GNU bashAdvanced Linux ProgrammingAdvanced Bash Scripting Guide 的文档...

然后,要么使用显式 syscalls(2) 设置管道和重定向,要么编写一些 bashzsh 脚本(但可能不是 POSIX /bin/sh 之一!)来完成这项工作。

我不知道amixer sget Master 是做什么的,但也许你可以考虑像这样的管道

 amixer sget Master | awk -F '[][]' '/dB/ { print $2 }'

(并且上述管道与 POSIX sh 兼容,因此可以从 popen(3)... 调用)

我很惊讶你需要做这一切。我想音量可以通过/sys/的一些伪文件来查询

了解更多关于ALSA 并阅读一些Guide thru the Linux sound API

【讨论】:

  • 不要那样做。编写一些bashzsh(但不是sh !!!)shell 脚本并从system 运行它,或者使用显式syscalls(2)
  • 另外值得知道的是,您可以使用popen 启动一个shell,并从您的C 程序中将一个脚本提供给它的标准输入。这样,您就不需要额外的文件(可能不可用)。当然,您应该只对非常小的脚本执行此操作。
猜你喜欢
  • 2011-09-24
  • 2013-06-26
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 2015-12-25
  • 2014-10-10
相关资源
最近更新 更多