标签: execv

如何让gdb跟随execv?尽管"跟随执行模式"不工作

我写了两个简单的程序:

int main(int ac, char **argv ) {
    execv( "/home/me/Desktop/execvtest2", argv );
}
Run Code Online (Sandbox Code Playgroud)

int main(int ac, char **argv ) {
    execv( "/home/me/Desktop/execvtest1", argv );
}
Run Code Online (Sandbox Code Playgroud)

我用gcc -g将它们编译成相应的输出文件.我使用gcc(Ubuntu/Linaro 4.4.4-14ubuntu5.1)4.4.5运行Ubuntu 10.10.

当我使用GNU gdb(GDB)7.2-ubuntu调试第一个程序时,我可以直到第一个execv语句,但随后这两个文件继续运行.即使我将follow-exec-mode设置为new,我也无法进入第二个程序.当我设置catch exec时,gdb会在每次调用execv时停止(某些如何没有第二个程序的链接源,并且我无法退出gdb,因为它有点挂起!?)但是我无法跳过调用"新"(作为exec替换过程)的劣质程序.

那么怎么做呢?必须有一种方法可以进入新的流程吗?难道我做错了什么?

干杯

c debugging gdb execv

8
推荐指数
1
解决办法
5645
查看次数

使用 execv 运行时指定 Python 解释器的跨平台方法

我目前正在 Linux 和 Windows 7 上运行 Python 脚本。该文件以 execv 样式执行,我的意思是解释器是在命令的文件开头定义的。

在Windows系统中,解释器规范为:

#!C:\Python26\python.exe
Run Code Online (Sandbox Code Playgroud)

然而在 Linux 中这需要

#!/usr/bin/python
Run Code Online (Sandbox Code Playgroud)

我想在两个系统中运行此脚本,而不必一次又一次地更改此行。

我已经尝试过以下方法:

#!C:\Python26\python.exe
#!/usr/bin/python
Run Code Online (Sandbox Code Playgroud)

也:

#!C:\Python26\python.exe;/usr/bin/python
Run Code Online (Sandbox Code Playgroud)

那么:有什么方法可以指定多个解释器吗?

python execv

6
推荐指数
1
解决办法
1975
查看次数

从OCaml内部调用外部程序

我对OCaml很陌生,并试图弄清楚如何从OCaml中调用外部程序.

我一直在这里关注文档,并拨打以下电话:

Unix.execv "cat text_file";;
Run Code Online (Sandbox Code Playgroud)

这将返回以下内容:

string array -> 'a = <fun>
Run Code Online (Sandbox Code Playgroud)

我究竟如何访问返回的匿名函数?

cat text_file是一个简单的尝试打印文件的内容,我实际想要运行的命令有点复杂.但是,我认为如果我可以运行,我应该能够让我的真实程序运行.

unix ocaml execv

6
推荐指数
2
解决办法
1611
查看次数

在父线程出口而不是父进程出口上调用prctl(PR_SET_PDEATHSIG,SIGNAL)

我有一个分支到子进程的进程。如果父进程存在,则子进程不应存在。因此,如果父进程死亡,我在子进程中调用:: prctl(PR_SET_PDEATHSIG,SIGKILL)杀死它。最终发生的是父线程调用pthread_exit,该线程最终成为杀死子进程的催化剂。

这是我的代码:

parent.cpp:

#include <sys/prctl.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>
#include <iostream>

void* run(void* ptr) {

    std::cout << "thread:" << getpid() << ":" << std::hex << pthread_self() << ":" << std::dec << getppid() << std::endl;
    auto pid = fork();
    if ( pid != 0 ) {
        sleep(1);
    }
    else {
        char* arg = NULL;
        execv("./child", &arg);
    }
    return NULL;
}

int main() {

    std::cout << "main:" << getpid() << ":" << std::hex << pthread_self() << ":" << std::dec …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading fork execv

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

execv 和 fork:通知父进程子进程执行文件失败

主进程如何知道子进程执行文件失败(例如没有这样的文件或目录)?例如,在下面的代码中,我们怎样才能让 run() 返回 0 以外的值呢?谢谢!

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

enum ErrorType { noError, immediateFailure, returnFailure, forkFailure };

using namespace std;

int run(void)
{
    int error = noError;
    //char proc[] = "/bin/uname";
    char proc[] = "/usr/bin/Idontexist";
    char *const params[] = {proc, NULL};

    pid_t pid = fork();

    printf("pid = %d\n",pid);

    if (pid == 0)
    {
        if ( execv(proc,params)==-1 )
        {
            error = immediateFailure;
        }
        printf("child: error = %d\n",error);
    }
    else if (pid > 0)
    {
        /*  This is …
Run Code Online (Sandbox Code Playgroud)

c fork execv waitpid

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

这会被视为内存泄漏吗?

考虑这个毫无意义的计划:

/* main.c */

#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv) {
    int i;
    for (i = 0; i < 1024; i++) {
        int pid = fork();
        int status;
        if (pid) {
            wait(&status);
        }
        else {
            char *ptr = (char *)malloc(1024*sizeof(char));
            char *args[2] = {"Hello, world!", NULL};
            execve("/bin/echo", args, NULL);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不会释放ptr构成main.c或其他程序的内存泄漏,或者当调用execve时它是否会被释放?

c malloc memory-leaks fork execv

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

如何将后台运行的子进程调到前台

如果我使用 fork() 和 execv() 生成多个在后台运行的子进程,并且我想将其中一个子进程带到前台,我该怎么做?

我正在尝试编写一个可以在前台或后台启动进程的外壳程序。

c++ linux fork process execv

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

C++ fork()和execv()问题

我是C++上的新手,并在Linux上开发一个简单的程序,该程序应该调用同一目录中的另一个程序并获取被调用程序的输出,而不显示调用程序上调用程序的输出.这是我正在处理的代码片段:

    pid_t pid;
    cout<<"General sentance:"<<endl<<sentence<<endl;
    cout<<"==============================="<<endl;
    //int i=system("./Satzoo");
    if(pid=fork()<0)
        cout<<"Process could not be created..."<<endl;
    else
    {
        cout<<pid<<endl;
        execv("./Satzoo",NULL);
    }
    cout<<"General sentance:"<<endl<<sentence<<endl;
    cout<<"==============================="<<endl;
Run Code Online (Sandbox Code Playgroud)

我遇到的一个问题是我能够在控制台上打印前两行,但我不能打印最后两行.我认为当我调用Satzoo程序时程序停止工作.另一件事是这个代码调用Satzoo程序两次,我不知道为什么?我可以在屏幕上看到输出两次.另一方面,如果我使用system()而不是execv(),那么Satzoo只能使用一次.

我还没想出如何在我的程序中读取Satzoo的输出.

任何帮助表示赞赏.

谢谢

c++ linux fork execv

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

从C++执行命令,argv [0]中的预期是什么?

我正在使用execv()从/ bin /运行命令,例如来自我的c ++程序的'ls','pwd','echo',我想知道我应该在argv [0]中提供什么值;

const char * path = getPath();
char ** argv = getArgs();

execv(path,argv);
Run Code Online (Sandbox Code Playgroud)

c++ linux execv argument-passing

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

如何通过使用os.execv()在python中继承stdin和stdout

首先,我编写了一个c ++代码,如下所示:

#include <cstdio>
int main()
{
    int a,b;
    while(scanf("%d %d",&a,&b) == 2)
        printf("%d\n",a+b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

g++ -o a a.cpp习惯于使它复杂化。

之后,我编写了如下的python代码:

import os,sys
sys.stdin = open("./data.in","r")
sys.stdout = open("./data.out","w")
pid = os.fork()
if pid == 0:
    cmd = ["./a","./a"]
    os.execv(cmd[0],cmd)
Run Code Online (Sandbox Code Playgroud)

但是,该data.out文件不包含任何内容。也就是说,子进程没有从其父进程继承stdin和stdout。但是当我编写如下的c ++代码时:

#include<unistd.h>
#include<cstdio>
int main()
{
    freopen("data.in","r",stdin);a
    freopen("data.out","w",stdout);
    int pid = fork();
    if(pid == 0)
    {
        char* cmd[]= {"./a","./a"};
        execv(cmd[0],cmd);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在中得到了正确的答案,data.out也就是说execv在c ++代码中有效。

那么,我该怎么做才能让execv也能在python中工作?我真的需要此功能才能工作,有人可以告诉我吗?非常感谢!

data.in 包含以下内容:

1 1
Run Code Online (Sandbox Code Playgroud)

python stdin fork stdout execv

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