我正试图让一个小的ffmpeg转换器服务启动并运行,到目前为止取得了相当不错的进展.但是当涉及到产生转换的实际ffmpeg过程时,我正在撞墙.
// options.ffmpegopts is an array containing format-specific parameters
var args = [ '-y', '"' + options.targetfile + '"' ];
args = options.ffmpegopts.concat(args);
var ffmpegProc = spawn('ffmpeg ', args);
ffmpegProc.stderr.on('data', function(data) {
console.log('stderr: ' + data);
});
Run Code Online (Sandbox Code Playgroud)
执行此代码时,我得到以下控制台输出:
stderr: execvp(): No such file or directory
Run Code Online (Sandbox Code Playgroud)
我已经检查了不同的节点版本(0.4.0,0.4.2和0.5.0-pre)而没有任何影响.
另一个非常奇怪的行为是我必须调用spawn包括一个空格('ffmpeg '而不仅仅是'ffmpeg').如果我省略这个空格,我会得到一个不同的错误(stderr: "/path/to/my/movie.mpeg": no such file or directory).直接从shell调用ffmpeg时,发送到child_process.spawn()的命令执行没有任何问题.
那个提示有什么提示吗?我已经检查了其他实现相同的项目(比如node-imagemagick或ffmpeg-node,但启示没有打到我...
使用我的应用程序运行时strace -fF -o strace.log node server.js,我可以grep以下进程产生调用:
execve("/usr/local/sbin/ffmpeg", ["ffmpeg", "-i", "\"/data/media_dev/test/ORG_mymovi"..., "-sameq", "-ab", …Run Code Online (Sandbox Code Playgroud) 我目前正在我的一个 c 程序中执行以下 Linux 命令以显示正在运行的进程。无论如何我可以修改它以显示停止的进程和正在运行的进程吗?
char *const parmList[] = {"ps","-o","pid,ppid,time","-g","-r",groupProcessID,NULL};
execvp("/bin/ps", parmList);
Run Code Online (Sandbox Code Playgroud) 每当我尝试编译 c/cpp 文件时,都会出现此错误:
gcc: fatal error: cannot execute ‘as’: execvp: No such file or directory
compilation terminated.
Run Code Online (Sandbox Code Playgroud)
我还尝试在编译时包含文件的完整路径,但发生了同样的错误。为了确保版本不匹配,我查找了 gcc 和 g++ 版本,但两者都是相同的,gcc/g++ 版本:9.1.0。
我怎样才能解决这个问题?
我有一个像这样的代码块作为子线程运行:
if(someVar == 1){
doSomeStuff;
_exit(0)
}
else
execvp(*(temp->_arguments), temp->_arguments);
printf("I'm done\n");
Run Code Online (Sandbox Code Playgroud)
当我用someVar == 1运行程序时,我知道_exit(0)调用会杀死我的线程.但是,当它设置为0时,为什么程序在execvp()调用之后不继续并执行printf语句?
我正在编写一个代表 Linux 新 shell 的代码。我想要支持的命令之一是运行一个进程,例如,如果我得到以下行
command [arguments]
然后我想command作为一个进程运行,直到它完成运行该进程。
为此,我知道我需要使用fork()它来获取子进程并获取它的 PID,我的问题是我不知道它们之间有什么区别:
exec, execvp, execl, execv... 我不知道该使用哪个以及为什么。
我目前的代码:
void External_Process(char *arguments[MAX_ARG], char* command)
{
int pID;
switch(pID = fork())
{
case -1:
perror("fork failed");
break;
case 0 :
setpgrp();
//execv(command, arguments);
//execvp(command, arguments);
//execl("/bin/bash", "/bin/bash","-c",command,NULL);
printf("smash error: > bad command %s\n" , command);
exit(-1) ;
break;
default:
return ;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢 !
我有一个简单的程序(工作示例):
#include <unistd.h>
#include <stdio.h>
int main() {
pid_t my_pid = getpid();
char str[30];
sprintf(str, "/proc/%d/fd", my_pid);
printf("hello, I am gonna print out: %s", str);
execvp( "ls", (char *[]) { "ls", str, NULL } );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在 Linux VM 上用 gcc 编译。我的问题是为什么发送到的输出printf永远不会打印。
我知道printf缓冲其输出并且仅刷新\n. 我想知道为什么在这种情况下它不打印。我读到输出流在程序退出时被刷新。正在一块内存printf中缓冲输出(我在实现中确认了这一点)。malloc
我对此的疑问(欢迎更多详细信息):
execvp导致输出打印在 上stdout,但它没有按原样打印?ls我的想法是,即使在蚕食进程之后,它是否仍然被认为是程序退出?printf的内存缓冲区会被视为输出流吗?10文件描述符。zsh255bash我一直在尝试在Rust中编写一个直接链接到libc库的shell .我用a Vec<String>来保存要传递的参数execvp(),但似乎我的转换char **没有成功.执行时,所有参数都变为空字符串.
这是涉及的代码片段.
fn safe_execvp(path: String, argv: Vec<String>) -> Result<(), i32> {
unsafe {
let c_path = CString::new(path.as_str()).unwrap();
let mut c_argv_vec = Vec::new();
for arg in &argv {
let c_arg = CString::new(arg.as_str()).unwrap().as_ptr();
c_argv_vec.push(c_arg);
}
c_argv_vec.push(std::ptr::null());
match execvp(c_file.as_ptr(), c_argv_vec.as_ptr()) {
num => Err(num),
}
}
}
Run Code Online (Sandbox Code Playgroud)
execvp是C库函数定义为fn execvp(file: *const i8, argv: *const*const i8) -> i32;.
我不确定我做错了什么.是因为参数的内存在调用之前被释放了execvp()吗?
我有问题执行*.txt通配符,并且在C中读取此线程 - exec()任何命令 - 表明由于"全局"问题很难.有没有简单的方法来解决这个问题?
这是我正在尝试做的事情:
char * array[] = {"ls", "*.txt", (char *) NULL };
execvp("ls", array);
Run Code Online (Sandbox Code Playgroud) 我们知道我们可以在Linux中创建硬链接,ln file1 file2这将成为file2一个硬链接file1.
但是,当我尝试使用C程序执行此操作时,我遇到了问题.下面是C代码.
#include<stdio.h>
#include<string.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
if ((strcmp (argv[1],"ln")) == 0 )
{
char *myargs[4];
myargs[0] = "ln";
myargs[1] = argv[3];
myargs[2] = argv[4];
myargs[3] = NULL;
execvp(myargs[0], myargs);
printf("Unreachable code\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用gcc编译这个程序后,我按如下方式运行它.
$ ./a.out ln file1 file2
ln: failed to access ‘file2’: No such file or directory
$
Run Code Online (Sandbox Code Playgroud)
这里file1存在并且file2是期望的硬链接.
任何人都可以指出我在哪里弄错了.
谢谢.