在fork()中,execl不';我不能回到父母身边

在fork()中,execl不';我不能回到父母身边,c,unix,fork,argv,C,Unix,Fork,Argv,这是我的第一份文件: int main(int argc, char *argv[]){ printf("\n\nJe suis dans le fils\n\n"); execl("/exec","ii",NULL); printf("\n\nJe suis revenu dans le fils\n\n"); } 这是exec文件: int main(int argc, char *argv[]){ printf("\n\n\n\nJe suis dans le exec\n\n\

这是我的第一份文件:

int main(int argc, char *argv[]){

printf("\n\nJe suis dans le fils\n\n");

execl("/exec","ii",NULL);

printf("\n\nJe suis revenu dans le fils\n\n");
}
这是exec文件:

int main(int argc, char *argv[]){

printf("\n\n\n\nJe suis dans le exec\n\n\n\n");
printf("\n\n argc = %d \n\n argv[0] = %s \n\n argv[1] = %s",argc,argv[0],argv[1]);

}
问题是:

我在exec文件中被阻止,因此1s文件中我的
execl
之后的
printf
不会显示:/ 另外,当我打印argv[0]时,通常它会显示文件路径,但在这里它会显示“ii”

我是exec文件中的block,所以printf在我的exec之后,在1s中 文件,不显示

没错,
execl
不会返回(除非有错误)。一旦您执行了
exec
,就没有回头路了:实际上,您的进程将自己变成另一个进程,执行一个不同的程序

当我打印argv[0]时,通常它会显示文件 但在这里它显示了“ii”

正如您所想,
argv[0]
不应该被认为是理所当然的。父进程可以指定它想要的任何内容(甚至可以忽略它)。在本例中,您将子项的
argv[0]
指定为
ii
。如果要正确设置它(无论是什么),请添加第二个
“/exec”


旁注:如果您想要一种简单的执行方法,您可能需要查看标准的
system(3)
popen(3)
函数

我是exec文件中的block,所以printf在我的exec之后,在1s中 文件,不显示

没错,
execl
不会返回(除非有错误)。一旦您执行了
exec
,就没有回头路了:实际上,您的进程将自己变成另一个进程,执行一个不同的程序

当我打印argv[0]时,通常它会显示文件 但在这里它显示了“ii”

正如您所想,
argv[0]
不应该被认为是理所当然的。父进程可以指定它想要的任何内容(甚至可以忽略它)。在本例中,您将子项的
argv[0]
指定为
ii
。如果要正确设置它(无论是什么),请添加第二个
“/exec”



旁注:如果你想用一种简单的方法来执行某些东西,你可能需要查看标准的
系统(3)
popen(3)
函数。

好的,那么如果execl()没有返回到父级,你知道exec()函数返回到父级吗?@shubha没有exec函数返回到父级。@R。。我认为你反应过度了。有理由对如何使用
system()
popen()
持谨慎态度,但对大多数POSIX函数也有理由持谨慎态度,谨慎使用的
system()
popen()
函数足够安全。建议posix_spawn()是不友好的;这是一个非常复杂的函数,甚至比
scanf()
@JonathanLeffler更糟糕:
system
不是线程安全的,它以干扰信号处理的方式修改全局进程状态。我认为这足以说明它永远不应该被使用;有理由说“如果您使用的是线程,您可能应该避免
system()
”,的POSIX规范指定它不需要是线程安全的,并且还指定它使用SIGINT、SIGQUIT和SIGCHLD信号。显然,如果这是您的代码的问题,您不应该使用它。有趣的是,
popen()
没有这些警告。了解您所使用的产品的规格是很重要的。使用它并不总是错误的-我的大多数程序仍然是单线程的。那么,如果execl()没有返回到父级,您知道exec()函数返回到父级的原因吗?@shubha没有exec函数返回到父级。@R。。我认为你反应过度了。有理由对如何使用
system()
popen()
持谨慎态度,但对大多数POSIX函数也有理由持谨慎态度,谨慎使用的
system()
popen()
函数足够安全。建议posix_spawn()是不友好的;这是一个非常复杂的函数,甚至比
scanf()
@JonathanLeffler更糟糕:
system
不是线程安全的,它以干扰信号处理的方式修改全局进程状态。我认为这足以说明它永远不应该被使用;有理由说“如果您使用的是线程,您可能应该避免
system()
”,的POSIX规范指定它不需要是线程安全的,并且还指定它使用SIGINT、SIGQUIT和SIGCHLD信号。显然,如果这是您的代码的问题,您不应该使用它。有趣的是,
popen()
没有这些警告。了解您所使用的产品的规格是很重要的。使用它并不总是错误的-我的大多数程序仍然是单线程的。欢迎使用堆栈溢出。请尽快阅读这一页。请注意,您的
execl
(a)在根目录中执行一个程序,这是您永远不应该执行的(不要在根目录中工作,只有root才能写入,并且不要以root身份进行编程,除非您真的喜欢从备份中恢复,并且有好的备份可从中恢复),并且(b)只传递一个参数,
“ii”
,它将作为
argv[0]
提供给执行的程序。也许您需要
execl(“/exec”、“/exec”、“ii”、(char*)NULL)向程序传递两个参数
exec
也是一个内置的shell。很想编辑标题并删除对“fork”的引用,但我只想问:fork在哪里?execl没有暗示fork,这可能是您困惑的根源。如果要分叉,必须显式执行。OT:它应该是:
execl(“/exec”,“ii”,“char*)NULL)欢迎使用堆栈溢出。请尽快阅读这一页。请注意,您的
execl
(a)在根目录中执行一个程序,您应该