execl() 适用于我的一个代码,但不适用于另一个代码
execl() works on one of my code, but doesn't work on another
我已经在代码中使用了 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
有人知道为什么它不起作用吗?
我的 C 有点生疏,但你的代码犯了很多新手错误。
execl
如果成功将替换当前进程。因此,如果子项可以成功启动,最后一行 ("i have no idea why") 将不会打印。这意味着...
execl
失败,你没有检查!提示:检查类型转换为 char *
.
您在 execl
调用中将 int
转换为 char *
,然后在启动子项 (admin
) 时再次转换。这是 C 中的一个大禁忌。它允许您自由地误解类型。唯一的警告通常是崩溃。 GGC 会警告你。我不知道 AWS 上的编译器。
检查数组的绑定!您不知道启动时使用了多少个参数 admin
。 argv[0]
始终存在,因为它包含程序名称的表示形式。 argv[1]
可能未定义。越界访问数组是一种未定义的行为,非常危险。
在 C 中启动另一个进程的标准方法是 fork
父进程,然后调用 exec
家族中的一个函数来启动另一个进程。
改为考虑这个(我冒昧地发出不同的消息以使它们更清楚)。
parent.c
#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;
}
admin.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;
}
我已经在代码中使用了 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
有人知道为什么它不起作用吗?
我的 C 有点生疏,但你的代码犯了很多新手错误。
execl
如果成功将替换当前进程。因此,如果子项可以成功启动,最后一行 ("i have no idea why") 将不会打印。这意味着...execl
失败,你没有检查!提示:检查类型转换为char *
.您在
execl
调用中将int
转换为char *
,然后在启动子项 (admin
) 时再次转换。这是 C 中的一个大禁忌。它允许您自由地误解类型。唯一的警告通常是崩溃。 GGC 会警告你。我不知道 AWS 上的编译器。检查数组的绑定!您不知道启动时使用了多少个参数
admin
。argv[0]
始终存在,因为它包含程序名称的表示形式。argv[1]
可能未定义。越界访问数组是一种未定义的行为,非常危险。
在 C 中启动另一个进程的标准方法是 fork
父进程,然后调用 exec
家族中的一个函数来启动另一个进程。
改为考虑这个(我冒昧地发出不同的消息以使它们更清楚)。
parent.c
#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;
}
admin.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;
}