linux 下execl执行成功后自行结束了程序问题

时间:2022-07-07 08:36:59

   char * = "php";
   char * p1 = "/home/webgame/1.php";
   execl("/usr/bin/php",p,p1,"123","sde2",NULL);
   printf("success");
   char ex_str[4];
   while(1)
   {
     scanf("%4s",ex_str);
     printf("----%s---\r\n",ex_str);
    if(strcmp(ex_str,"exit") == 0)
    {
        exit(0);
     }
   }


代码如上。。 1.PHP中就是写参数到一个固定路径的文件上。。
程序执行,已直接1.PHP,写了文件。。。但执行后,程序自行退出了。。
并且execl 后的printf都没有输出.

14 个解决方案

#1


要怎样做才能正常执行(主要是execl函数运行php文件。),并输入exit退出

#2


execl会载入你调用的程序,覆盖原有代码段,相当于你本来的程序的代码段被替换成execl执行的了。
所以execl后面的都不会输出了。
正确的应该是fork一个子进程,在子进程中调用execl

#3


如果我把execl 放到用pthread_create创建的线程是不是也一样会覆盖原有的代码。。
我测试过也是一样会退出。。
一定要用fork 吗?

#4


如果用了fork 。执行execl 后会不会停止 子进程的呢。。

#5


引用 3 楼 wssdr0905 的回复:
如果我把execl 放到用pthread_create创建的线程是不是也一样会覆盖原有的代码。。
我测试过也是一样会退出。。
一定要用fork 吗?

execl是覆盖进程的代码段,所以如果你原来的程序还需要正常退出的话,就要fork一个子进程。
另外,如果需要execl调用的这个程序执行完成,就需要在父进程中等待,可以调用waitpid。
具体的你man一下看看。

#6


引用 4 楼 wssdr0905 的回复:
如果用了fork 。执行execl 后会不会停止 子进程的呢。。

fork以后,子进程拷贝父进程的几乎所有特性,包括pc,也就是说,在子进程中,还是从你fork的地方开始运行的。然后你execl,覆盖掉的是子进程的代码段,与父进程无关。

#7


我的程序的主要功能是:通过sokect,监听端口。接受信息,根据信息创建定时器去执行execl ...

#8


[code=C/C++]    
fflush(stdout);
if ((pid = fork()) < 0) {
    perror("fork()\n");
}
else if (pid == 0) {
    execl("/usr/bin/php", p, p1, "123", "sde2", (char*)0);
    printf("success");
}
[code]

#9


额,忘记怎么代码高亮了~

#10


是的,一定要用fork!pthread_create创建的子线程与父线程共用同一代码段!只是寄存器和栈不同!

#11


execl不是创建一个新进程,Linux只有fork能创建新进程

#12


原文抄《UNIX平台下C语言高级编程指南》第3章《进程及进程间通信》第3.2.2节《exec系统调用》一段话:

系统调用exec是用来执行一个可执行文件来代替当前进程的执行图像。需要注意的是,该调用并没有生成新的进程,而是在原有进程的基础上,替换原有进程的正文,调用前后是同一个进程,进程号PID不变。但执行的程序变了(执行的指令序列改变了)。它有六种调用的形式,随着系统的不同并不完全与以下介绍的相同。

int execve(const char *path, char *const argv[], char *const envp[]);
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);

#13


execl成功是不会返回的,会执行新的程序。
execl失败才会返回

#14


引用 5 楼 tankdin 的回复:
execl是覆盖进程的代码段,所以如果你原来的程序还需要正常退出的话,就要fork一个子进程。
另外,如果需要execl调用的这个程序执行完成,就需要在父进程中等待,可以调用waitpid。
具体的你man一下看看。


正解

#1


要怎样做才能正常执行(主要是execl函数运行php文件。),并输入exit退出

#2


execl会载入你调用的程序,覆盖原有代码段,相当于你本来的程序的代码段被替换成execl执行的了。
所以execl后面的都不会输出了。
正确的应该是fork一个子进程,在子进程中调用execl

#3


如果我把execl 放到用pthread_create创建的线程是不是也一样会覆盖原有的代码。。
我测试过也是一样会退出。。
一定要用fork 吗?

#4


如果用了fork 。执行execl 后会不会停止 子进程的呢。。

#5


引用 3 楼 wssdr0905 的回复:
如果我把execl 放到用pthread_create创建的线程是不是也一样会覆盖原有的代码。。
我测试过也是一样会退出。。
一定要用fork 吗?

execl是覆盖进程的代码段,所以如果你原来的程序还需要正常退出的话,就要fork一个子进程。
另外,如果需要execl调用的这个程序执行完成,就需要在父进程中等待,可以调用waitpid。
具体的你man一下看看。

#6


引用 4 楼 wssdr0905 的回复:
如果用了fork 。执行execl 后会不会停止 子进程的呢。。

fork以后,子进程拷贝父进程的几乎所有特性,包括pc,也就是说,在子进程中,还是从你fork的地方开始运行的。然后你execl,覆盖掉的是子进程的代码段,与父进程无关。

#7


我的程序的主要功能是:通过sokect,监听端口。接受信息,根据信息创建定时器去执行execl ...

#8


[code=C/C++]    
fflush(stdout);
if ((pid = fork()) < 0) {
    perror("fork()\n");
}
else if (pid == 0) {
    execl("/usr/bin/php", p, p1, "123", "sde2", (char*)0);
    printf("success");
}
[code]

#9


额,忘记怎么代码高亮了~

#10


是的,一定要用fork!pthread_create创建的子线程与父线程共用同一代码段!只是寄存器和栈不同!

#11


execl不是创建一个新进程,Linux只有fork能创建新进程

#12


原文抄《UNIX平台下C语言高级编程指南》第3章《进程及进程间通信》第3.2.2节《exec系统调用》一段话:

系统调用exec是用来执行一个可执行文件来代替当前进程的执行图像。需要注意的是,该调用并没有生成新的进程,而是在原有进程的基础上,替换原有进程的正文,调用前后是同一个进程,进程号PID不变。但执行的程序变了(执行的指令序列改变了)。它有六种调用的形式,随着系统的不同并不完全与以下介绍的相同。

int execve(const char *path, char *const argv[], char *const envp[]);
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);

#13


execl成功是不会返回的,会执行新的程序。
execl失败才会返回

#14


引用 5 楼 tankdin 的回复:
execl是覆盖进程的代码段,所以如果你原来的程序还需要正常退出的话,就要fork一个子进程。
另外,如果需要execl调用的这个程序执行完成,就需要在父进程中等待,可以调用waitpid。
具体的你man一下看看。


正解