标签: execvp

在node.js中生成子进程时出错

我正试图让一个小的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-imagemagickffmpeg-node,但启示没有打到我...

更新:strace()输出

使用我的应用程序运行时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)

spawn execvp node.js

5
推荐指数
1
解决办法
9307
查看次数

显示已停止和正在运行的进程的 Linux 命令?

我目前正在我的一个 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 linux process execvp

5
推荐指数
2
解决办法
1万
查看次数

致命错误:无法执行“as”:execvp:没有这样的文件或目录

每当我尝试编译 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。

我怎样才能解决这个问题?

c gcc compiler-errors compilation execvp

5
推荐指数
1
解决办法
2498
查看次数

在execvp返回之后,为什么我的程序不会从它停止的地方开始?

我有一个像这样的代码块作为子线程运行:

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语句?

c multithreading execvp

4
推荐指数
1
解决办法
3077
查看次数

exec、execvp、execl、execv 之间的区别?

我正在编写一个代表 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)

谢谢 !

c linux process exec execvp

4
推荐指数
1
解决办法
6647
查看次数

为什么我没有看到 printf 缓冲区刷新?

我有一个简单的程序(工作示例):

#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

c printf stdout execvp output

4
推荐指数
1
解决办法
96
查看次数

如何将向量传递给execvp

我想将一个向量作为第二个参数传递给execvp.可能吗?

c++ vector execvp

3
推荐指数
1
解决办法
5511
查看次数

将Rust中的Vec <String>传递给C中的char**

我一直在尝试在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()吗?

unsafe libc execvp rust

3
推荐指数
2
解决办法
935
查看次数

如何在C中execvp ls*.txt

我有问题执行*.txt通配符,并且在C中读取此线程 - exec()任何命令 - 表明由于"全局"问题很难.有没有简单的方法来解决这个问题?

这是我正在尝试做的事情:

char * array[] = {"ls", "*.txt", (char *) NULL };
execvp("ls", array);
Run Code Online (Sandbox Code Playgroud)

c shell ls wildcard execvp

2
推荐指数
1
解决办法
1867
查看次数

如何从C程序在Linux中创建硬链接

我们知道我们可以在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是期望的硬链接.

任何人都可以指出我在哪里弄错了.

谢谢.

c linux hardlink execvp

2
推荐指数
1
解决办法
4571
查看次数