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
所以execl后面的都不会输出了。
正确的应该是fork一个子进程,在子进程中调用execl
#3
如果我把execl 放到用pthread_create创建的线程是不是也一样会覆盖原有的代码。。
我测试过也是一样会退出。。
一定要用fork 吗?
我测试过也是一样会退出。。
一定要用fork 吗?
#4
如果用了fork 。执行execl 后会不会停止 子进程的呢。。
#5
execl是覆盖进程的代码段,所以如果你原来的程序还需要正常退出的话,就要fork一个子进程。
另外,如果需要execl调用的这个程序执行完成,就需要在父进程中等待,可以调用waitpid。
具体的你man一下看看。
#6
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]
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[]);
系统调用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失败才会返回
execl失败才会返回
#14
正解
#1
要怎样做才能正常执行(主要是execl函数运行php文件。),并输入exit退出
#2
execl会载入你调用的程序,覆盖原有代码段,相当于你本来的程序的代码段被替换成execl执行的了。
所以execl后面的都不会输出了。
正确的应该是fork一个子进程,在子进程中调用execl
所以execl后面的都不会输出了。
正确的应该是fork一个子进程,在子进程中调用execl
#3
如果我把execl 放到用pthread_create创建的线程是不是也一样会覆盖原有的代码。。
我测试过也是一样会退出。。
一定要用fork 吗?
我测试过也是一样会退出。。
一定要用fork 吗?
#4
如果用了fork 。执行execl 后会不会停止 子进程的呢。。
#5
execl是覆盖进程的代码段,所以如果你原来的程序还需要正常退出的话,就要fork一个子进程。
另外,如果需要execl调用的这个程序执行完成,就需要在父进程中等待,可以调用waitpid。
具体的你man一下看看。
#6
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]
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[]);
系统调用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失败才会返回
execl失败才会返回
#14
正解