我已经在代码中使用了execl()
,并且效果很好。
但这一次,我真的不知道为什么它不起作用。
所以这里的代码不起作用
#include <unistd.h>
#include <stdio.h>
int main()
{
int i = 896;
printf("please\n");
execl("home/ubuntu/server/LC/admin/admin", (char*)i, NULL);
printf("i have no idea why\n");
return 0;
}
这是admin.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/msg.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int mid = argv[0];
printf("hi from child\n");
printf("%d\n", mid);
return 0;
}
当然我将admin.c编译为admin,路径没有错。
>ls
admin admin.c why why.c
>pwd
/home/ubuntu/server/LC/admin
>./admin
hi from child
-1180858374
>./why
please
i have no ida why
任何人都知道它为什么不起作用?
答案 0 :(得分:0)
我的C有点生疏,但是你的代码犯了许多新手错误。
execl
将替换当前进程。因此,如果孩子能够成功启动,最后一行(&#34;我不知道为什么&#34;)不会打印。这意味着......
execl
失败了,你没有检查过它!提示:检查类型转换为char *
。
您在int
来电中将char *
投放到execl
,然后在您启动子女(admin
)时再次投放admin
。这是C中的一个大禁忌。它可以自由地让你误解类型。唯一的警告通常是崩溃。 GGC会警告你。我不了解AWS上的编译器。
检查阵列的绑定!您不知道启动了多少参数argv[0]
。 argv[1]
始终存在,因为它包含程序名称的表示。 fork
可能未定义。访问数组越界是一种未定义的行为并且非常危险。
在C中启动另一个进程的标准方法是exec
父进程,然后调用#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
int i = 896;
char str[15];
int pid;
printf("Hello from parent\n");
sprintf(str, "%d", i); // convert the number into string
pid = fork();
if (pid == -1)
{
printf("Fork failed\n");
}
else if (pid == 0)
{
printf("Continue from parent\n");
}
else
{
// start the child process
execl("home/ubuntu/server/LC/admin/admin", str, NULL);
// check if it started properly
if (errno != 0)
{
printf("Error launching child process: %s\n", strerror(errno));
return 1;
}
}
printf("Goodbye from parent\n");
return 0;
}
系列中的一个函数来启动另一个进程。
请考虑这一点(我冒昧地发出不同的信息以使它们更清晰)。
<强> parent.c 强>
#include <stdio.h>
#include <stdlib.h>
#include <sys/msg.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
char * mid;
// argc is always 1 or more
if (argc >= 2)
mid = argv[1];
else
mid = "<nothing>";
printf("hello from child\n");
printf("argc = %d, argv[1] = %s\n", argc, mid);
return 0;
}
<强> admin.c 强>
#include<stdio.h>
void ff(const char *format,...)
{
printf("hr");
}
int main()
{
ff("d","c");
}