调用execv()失败
代码:调用execv()失败,c,linux,C,Linux,代码: I'm parent! My PID is 4543 and my child's PID is 4544. I'm child! My PID is 4544. static void child(){ char*args[]={/bin/echo”,“Hello World!”,NULL}; printf(“我是孩子!我的PID是%d.\n”,getpid()); fflush(stdout); execv(“/bin/echo”,args);/!! err(EXIT_FAILUR
I'm parent! My PID is 4543 and my child's PID is 4544.
I'm child! My PID is 4544.
static void child(){
char*args[]={/bin/echo”,“Hello World!”,NULL};
printf(“我是孩子!我的PID是%d.\n”,getpid());
fflush(stdout);
execv(“/bin/echo”,args);/!!
err(EXIT_FAILURE,“execv()失败”);
}
静态无效父项(uu pid_ut pid_uc){
printf(“我是家长!我的PID是%d,我孩子的PID是%d。\n”,getpid(),PID_c);
退出(退出成功);
}
int main(){
__pid_t ret;
ret=fork();
如果(ret==-1){
错误(退出失败,“fork()失败”);
}else if(ret==0){
child();
}否则{
父母(ret);
}
err(退出失败,“不应到达此处”);
}
结果:
I'm parent! My PID is 4543 and my child's PID is 4544.
I'm child! My PID is 4544.
在上面的代码中,我想将child
进程替换为/bin/echo
进程,但echo
不起作用。更准确地说,调用execv()
失败
问题是什么?以下建议代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <err.h>
static void child() {
char* args[] = {"/bin/echo", "Hello World!", NULL};
printf("I'm child! My PID is %d.\n", getpid());
fflush(stdout);
execv( args[0], args);
err(EXIT_FAILURE, "execv() failed");
}
static void parent(__pid_t pid_c) {
printf("I'm parent! My PID is %d and my child's PID is %d.\n", getpid(), pid_c);
wait( NULL );
exit(EXIT_SUCCESS);
}
int main() {
__pid_t ret;
ret = fork();
if (ret == -1) {
err(EXIT_FAILURE, "fork() failed");
} else if (ret == 0) {
child();
} else {
parent(ret);
}
err(EXIT_FAILURE, "Shouldn't reach here");
}
#include
语句#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <err.h>
static void child() {
char* args[] = {"/bin/echo", "Hello World!", NULL};
printf("I'm child! My PID is %d.\n", getpid());
fflush(stdout);
execv( args[0], args);
err(EXIT_FAILURE, "execv() failed");
}
static void parent(__pid_t pid_c) {
printf("I'm parent! My PID is %d and my child's PID is %d.\n", getpid(), pid_c);
wait( NULL );
exit(EXIT_SUCCESS);
}
int main() {
__pid_t ret;
ret = fork();
if (ret == -1) {
err(EXIT_FAILURE, "fork() failed");
} else if (ret == 0) {
child();
} else {
parent(ret);
}
err(EXIT_FAILURE, "Shouldn't reach here");
}
我在您的输出中没有看到“execv()失败”。似乎未调用
err()
。为什么你认为execv会失败?什么是pid?在我将\uu pid\u t
更改为正确的pid\u t
后,POSIX fork返回pid\u tYour code为我工作。你在什么环境下运行这个?因为子进程是一个子进程,所以父进程在子进程完成之前返回调用方。例如,当我运行该程序时,我会在“我的下一个shell提示符”后看到“Hello World!”。如果您在某种IDE下运行此程序,则在父级完成后,子级的输出可能会丢失。您可以尝试在父级()中调用睡眠(10)
(即,在调用printf
和exit
之间)。父进程需要调用wait()
或waitpid()
以等待子进程完成。首先退出的父进程是产生“僵尸”的众所周知的方法(虽然现代OSs实际上将子进程附加到init
进程。实际上,父进程在发布的代码中首先退出,这导致子进程从未执行exec*()
函数,并且……,`除了缺少的wait()
语句,发布的代码也丢失了:#include#include#include#include#include#include
您是否希望我们猜测您的代码实际包含哪些头文件?谢谢。等待(NULL)
似乎很重要。@nblizz很可能是您的提示覆盖了hello world。。。