gpt4 book ai didi

无法在c中使用系统函数调用Linux命令

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:05 25 4
gpt4 key购买 nike

我想用 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(3) .该 C 函数(您可能应该避免,更喜欢显式 syscalls(2),如 forkexecve)正在运行 POSIX /bin/sh -c ;另请阅读 popen(3) .

但您的交互式 shell 可能是 bash其行为不同于 POSIX sh ,特别是对于像 <(amixer sget Master) 这样的重定向

为了让事情变得更复杂,/bin/bash 程序,作为sh调用时, 将其行为更改为 POSIX sh ,所以在许多系统上,/bin/sh/bin/bash 的符号链接(symbolic link)...

所以也请阅读 GNU bash 的文档, 和 Advanced Linux Programming , 和 Advanced 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

关于无法在c中使用系统函数调用Linux命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33992436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com