Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的exec族函数_C_Linux - Fatal编程技术网

C语言中的exec族函数

C语言中的exec族函数,c,linux,C,Linux,正如我们所知,exec系列函数调用最终调用execve(),这是一个系统调用,其余的是库函数。因此,通常情况下,应用于execve()的任何含义也适用于其他exec*()函数 我想知道,在执行execve()期间,是否所有信号都被阻塞,直到成功为止,或者是否有方法将信号传递给对应于exec的pid?(我知道它不会在成功后返回,也不会进一步执行调用函数)我不确定你的问题是否正确,如果我错了,请随时纠正我 但是,基本上,是的,从流程的角度来看,系统调用可以被认为是“原子的”。因此,一旦启动了exec

正如我们所知,exec系列函数调用最终调用
execve()
,这是一个系统调用,其余的是库函数。因此,通常情况下,应用于
execve()
的任何含义也适用于其他
exec*()
函数


我想知道,在执行
execve()
期间,是否所有信号都被阻塞,直到成功为止,或者是否有方法将信号传递给对应于exec的
pid
?(我知道它不会在成功后返回,也不会进一步执行调用函数)

我不确定你的问题是否正确,如果我错了,请随时纠正我

但是,基本上,是的,从流程的角度来看,系统调用可以被认为是“原子的”。因此,一旦启动了
execve()
系统调用,只有内核可以控制它,它不会释放进程,直到运行新命令或出现错误代码失败或发出
SIGKILL
信号(因为
SIGKILL
是唯一不可阻止的信号)


但是,一旦
execve()
产生了一个新的进程(并从内核返回),任何信号都完全可以中断;你能提供一些伪代码来说明你的问题吗?@csl我的问题简单明了,execve(或任何exec函数)会阻止所有信号直到它完成吗?看,我的问题简单明了,execve(或任何exec函数)会阻止所有信号直到它完成吗?是的。因为它位于内核空间(而不是用户空间)。那么,如何结束/杀死卡住(挂起)的exec函数,而不从其他上下文中杀死它的进程id?进程启动时不太可能卡在内核区域。。。因此,如果它挂起,可能是在程序启动之后,您应该能够像任何其他进程一样使用
SIGKILL
终止它。例如,像bdf(在hpux或linux中的df)这样的进程在找到其输出之前不会超时。现在,如果有任何nfs文件系统没有响应(nfs服务器),那么bdf将挂起,并且在尝试重新访问没有响应的nfs服务器时从不超时。因此,要杀死它,您可以从另一个终端(命令行)杀死bdf的进程。我试图从C程序运行bdf,并传递信号(报警),该信号将在n秒后终止(n是报警函数的参数),但由于报警发送SIGALRM,该信号将被阻止,直到bdf(通过exec)完成。