我写了两个简单的程序:
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替换过程)的劣质程序.
那么怎么做呢?必须有一种方法可以进入新的流程吗?难道我做错了什么?
干杯
我目前正在 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)
那么:有什么方法可以指定多个解释器吗?
我对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是一个简单的尝试打印文件的内容,我实际想要运行的命令有点复杂.但是,我认为如果我可以运行,我应该能够让我的真实程序运行.
我有一个分支到子进程的进程。如果父进程存在,则子进程不应存在。因此,如果父进程死亡,我在子进程中调用:: 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) 主进程如何知道子进程执行文件失败(例如没有这样的文件或目录)?例如,在下面的代码中,我们怎样才能让 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) 考虑这个毫无意义的计划:
/* 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时它是否会被释放?
如果我使用 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的输出.
任何帮助表示赞赏.
谢谢
我正在使用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 ++代码,如下所示:
#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)