jjzjj

c++ - 如何将字符串 vector 传递给 execv

我发现构建程序参数列表的最简单方法是作为字符串vector。但是,execv需要一个字符数组作为第二个参数。让它接受字符串vector的最简单方法是什么? 最佳答案 execv()只接受一个字符串指针数组。没有办法让它接受任何其他东西。它是一个标准接口(interface),可从任何托管语言调用,而不仅仅是C++。我已经测试过编译这个:std::vectorvector;constchar*programname="abc";constchar**argv=newconstchar*[vector.size()+2];//extra

python - subprocess.Popen execve() arg 3 包含一个非字符串值

我正在尝试通过shell运行另一个脚本,该脚本使用一组修改后的环境变量。defcgi_call(script,environ):pSCRIPT=subprocess.Popen(script,stdout=subprocess.PIPE,stderr=subprocess.PIPE,stdin=subprocess.PIPE,env=environ,shell=True)pc=pSCRIPT.communicate()status="200OK"headers=[('Content-Type',"text/html")]ifpc[1]!='':raiseRuntimeError,pc[

c - 信号不会在 execv() 中正确重新启用

我正在为我正在开发的Linux发行版编写系统关键程序。它需要在接收到某些信号时自行重启,以避免崩溃。问题是,重启后,我无法重新启用该信号。也就是说,信号不能被接收到两次。在execv()自身之后,当新进程调用signal()来设置信号时,将返回SIG_DFL。每次。即使我连续两次调用它-表明它从未在一开始就设置过。是否从原始过程中继承了一些奇怪的标志? 最佳答案 您实际上是在尝试递归处理信号,这与您犯规了。使用signal()时要注册一个信号处理程序,该信号编号将被阻塞,直到信号处理程序返回-实际上内核/libc在调用信号处理程序时

linux - x86_64 程序集 execve *char[] 系统调用

我试图在不使用标准库的情况下使用一些Linux64位x86程序集,但是我在处理提供给我的程序的参数(argv)时遇到了一些问题。我认为(根据文档)rsp标记argcqword的开始,而[rsp+8]将是argv。不幸的是,情况并非如此,以下(删节)程序会导致EFAULT(错误地址)。sys_execveequ59sys_exitequ60section.datachilddb"/bin/sh",0global_startsection.text_start:movrdi,child;#1filenamemovrsi,[rsp+8];#2argvmovrdx,0;#3envp=0movr

linux - execve shellcode linux段错误

我试图运行这个shellcode但它抛出我:“Segmentationfault”错误shellcode如下:shellcode.asm:global_start_start:jmpshortcadoit:popebxxoreax,eaxcdqmovbyte[ebx+7],almovlong[ebx+8],ebxmovlong[ebx+12],eaxleaecx,[ebx+8]movbyteal,0x0bint0x80ca:calldoitdb'/bin/sh'我编译它:'nasm-felfshellcode.asm'并将其链接为:'ld-melf_i386-s-oshellcodes

c - execve() 和环境变量

我对Linux如何处理传递给execve()的环境变量有疑问:execve()的概要:intexecve(constchar*filename,char*constargv[],char*constenvp[]);在调用execve()之前,我们从当前进程的内存映射中分配用于保存envs/args的内存。但是在execve()之后,调用进程的所有text/data/bss/stack都被新程序覆盖,旧进程的所有内存映射都没有保留(包括传递的envs/args的内存)。对于新程序,在哪里读取envs/args?内核是否复制传递的envs/args并将其放置到新的内存映射中,或者其他一些技

linux - 来自 Assembly 的 sys_execve 系统调用

asm_execve.s:.section.datafile_to_run:.ascii"/bin/sh".section.text.globlmainmain:pushl%ebpmovl%esp,%ebpsubl$0x8,%esp#arrayoftwopointers.array[0]=file_to_runarray[1]=0movlfile_to_run,%edimovl%edi,-0x4(%ebp)movl$0,-0x8(%ebp)movl$11,%eax#sys_execvemovlfile_to_run,%ebx#filetoexecuteleal-4(%ebp),%ecx

c - 当我调用 vfork() 时,我可以调用任何 exec*() 函数,还是必须调用 execve()?

FromtheLinuxmanpage:Thevfork()functionhasthesameeffectasfork(2),exceptthatthebehaviorisundefinediftheprocess[...]callsanyotherfunctionbeforesuccessfullycalling[...]oneoftheexec(3)familyoffunctions.这表明在vfork()之后调用任何exec*()函数是可以接受的。但是,在手册页的后面,它明确指出:Inparticular,theprogrammercannotrelyontheparentre

c - execl 和 execv 有什么区别?

我使用execv而不是execl。为了使用execv,我创建了一个数组,并在其中放置了用于execl的参数。然后我把这个数组放入execv我知道我必须为execv使用参数数组,但为什么呢?execl和execv有什么区别? 最佳答案 除了参数的格式外没有区别。它们最终都会调用相同的底层系统调用execve()。 关于c-execl和execv有什么区别?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com

c - 系统调用 fork() 和 execv 函数

我正在尝试使用此C代码连续运行两个可执行文件:#include#includeintmain(intargc,char*argv[]){fork();execv("./prcs1",&argv[1]);//GIVEADDRESSOF2ndelementasstartingpointtoskipsource.txtfork();execv("./prcs2",argv);printf("EXECVFailed\n");}程序在第一次execv()调用后退出,尽管有fork,它永远不会到达第二个execv()。我试过在第一个fork之后调用wait()但我不确定它缺少什么。知道为什么在子级