execl()适用于我的一个代码,但不适用于另一个代码

时间:2015-06-15 01:28:58

标签: c execl

我已经在代码中使用了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

任何人都知道它为什么不起作用?

1 个答案:

答案 0 :(得分:0)

我的C有点生疏,但是你的代码犯了许多新手错误。

    如果成功,
  1. execl将替换当前进程。因此,如果孩子能够成功启动,最后一行(&#34;我不知道为什么&#34;)不会打印。这意味着......

  2. execl失败了,你没有检查过它!提示:检查类型转换为char *

  3. 您在int来电中将char *投放到execl,然后在您启动子女(admin)时再次投放admin。这是C中的一个大禁忌。它可以自由地让你误解类型。唯一的警告通常是崩溃。 GGC会警告你。我不了解AWS上的编译器。

  4. 检查阵列的绑定!您不知道启动了多少参数argv[0]argv[1]始终存在,因为它包含程序名称的表示。 fork可能未定义。访问数组越界是一种未定义的行为并且非常危险。

  5. 在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");
    }