-1

私はすでに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

なぜそれがうまくいかないのか誰にも分かりますか?

4

1 に答える 1

0

私の C は少し錆びていますが、あなたのコードは初歩的な間違いをたくさん犯しています。

  1. execl成功した場合、現在のプロセスを置き換えます。したがって、子が正常に起動できる場合、最後の行 (「理由がわかりません」) は出力されません。つまり...

  2. execl失敗しました。チェックしていませんでした。ヒント: への型キャストを確認してくださいchar *

  3. 呼び出しで をにキャストしint、子 ( ) を起動するときにもう一度キャストします。これは C では大したことではありません。これにより、型を自由に誤解することができます。唯一の警告は、ほとんどの場合、クラッシュです。GGC はそれについて警告します。AWS のコンパイラについては知りません。char *execladmin

  4. 配列の境界を確認してください! admin起動されたパラメーターの数はわかりません。argv[0]プログラム名の表現が含まれているため、常に存在します。argv[1]定義されていない可能性があります。範囲外の配列へのアクセスは未定義の動作であり、非常に危険です。

C で別のプロセスを開始する標準的な方法は、親に対して行い、次にファミリfork内の関数の 1 つを呼び出して他のプロセスを開始します。exec

代わりにこれを検討してください (私は、それらをより明確にするために、さまざまなメッセージを発する自由を取りました)。

親.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;
}
于 2015-06-15T02:39:56.067 に答える