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

wssdr0905 2010-09-17 05:02:26

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都没有输出.
...全文
1835 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
AAA20090987 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tankdin 的回复:]
execl是覆盖进程的代码段,所以如果你原来的程序还需要正常退出的话,就要fork一个子进程。
另外,如果需要execl调用的这个程序执行完成,就需要在父进程中等待,可以调用waitpid。
具体的你man一下看看。[/Quote]

正解
mymtom 2010-09-18
  • 打赏
  • 举报
回复
execl成功是不会返回的,会执行新的程序。
execl失败才会返回
yui 2010-09-18
  • 打赏
  • 举报
回复
原文抄《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[]);
yzx714 2010-09-17
  • 打赏
  • 举报
回复
execl不是创建一个新进程,Linux只有fork能创建新进程
flyking247 2010-09-17
  • 打赏
  • 举报
回复
是的,一定要用fork!pthread_create创建的子线程与父线程共用同一代码段!只是寄存器和栈不同!
tankdin 2010-09-17
  • 打赏
  • 举报
回复
额,忘记怎么代码高亮了~
tankdin 2010-09-17
  • 打赏
  • 举报
回复
[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]
wssdr0905 2010-09-17
  • 打赏
  • 举报
回复
我的程序的主要功能是:通过sokect,监听端口。接受信息,根据信息创建定时器去执行execl ...
tankdin 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wssdr0905 的回复:]

如果用了fork 。执行execl 后会不会停止 子进程的呢。。
[/Quote]
fork以后,子进程拷贝父进程的几乎所有特性,包括pc,也就是说,在子进程中,还是从你fork的地方开始运行的。然后你execl,覆盖掉的是子进程的代码段,与父进程无关。
tankdin 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wssdr0905 的回复:]

如果我把execl 放到用pthread_create创建的线程是不是也一样会覆盖原有的代码。。
我测试过也是一样会退出。。
一定要用fork 吗?
[/Quote]
execl是覆盖进程的代码段,所以如果你原来的程序还需要正常退出的话,就要fork一个子进程。
另外,如果需要execl调用的这个程序执行完成,就需要在父进程中等待,可以调用waitpid。
具体的你man一下看看。
wssdr0905 2010-09-17
  • 打赏
  • 举报
回复
如果用了fork 。执行execl 后会不会停止 子进程的呢。。
wssdr0905 2010-09-17
  • 打赏
  • 举报
回复
如果我把execl 放到用pthread_create创建的线程是不是也一样会覆盖原有的代码。。
我测试过也是一样会退出。。
一定要用fork 吗?
tankdin 2010-09-17
  • 打赏
  • 举报
回复 1
execl会载入你调用的程序,覆盖原有代码段,相当于你本来的程序的代码段被替换成execl执行的了。
所以execl后面的都不会输出了。
正确的应该是fork一个子进程,在子进程中调用execl
wssdr0905 2010-09-17
  • 打赏
  • 举报
回复
要怎样做才能正常执行(主要是execl函数运行php文件。),并输入exit退出

69,396

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧