1

私が書いた他のいくつかの C プログラムを認識し、その C プログラムの新しいプロセスを生成して実行するプログラム msh を作成したいと考えています。

たとえば、mycopy、myremove、および mymove という独自のコピー、移動、および削除関数を既に作成しています。

./msh mycopy file1 file2 を実行して、msh に新しいプロセスを生成させ、mycopy を実行してアクションを実行し、その子プロセスが終了するのを待ってから終了できるようにしたいと考えています。

以下に示すものを試してみましたが、コンパイルはできますが、実際にはタスクを実行していないようです。助言がありますか?以前に fork()、execl()、または wait() を使用したことがないため、インクルードまたはパラメーターを見逃している可能性があります。間違っている場合は修正してください。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>

int main(int argc, char* argv[]){

int pid;

if(strcmp(argv[1], "mycopy") == 0){
    if(pid = fork() == 0){
        execl("/home/1234/mycopy", argv[2], argv[3]);
    }
}

if(strcmp(argv[1], "myremove") == 0){
    if(pid = fork() == 0){
        execl("/home/1234/myremove", argv[2]);
    }
}

if(strcmp(argv[1], "mymove") == 0){
    if(pid = fork() == 0){
        execl("/home/1234/mymove", argv[2], argv[3]);
    }
}

if(pid > 0){
    wait((int*)0);
}

return 0;
}

私はこれを試してみて、3回印刷しました。それは私のexeclコマンドが壊れていることを意味しますか?もしそうなら、argv[2]とargv[3]を./mycopyに渡す必要があるため、どうすれば修正できますか?

    int pid = fork();
    if(strcmp(argv[1], "mycopy") == 0){
            if(pid  == 0){
                    printf("WORKING1");
                    execl("/home/1234/mycopy", argv[2], argv[3]);
                    printf("WORKING2");
            }
    }
     wait((int*)0);
    printf("WORKING3");
    return 0;
4

1 に答える 1

2

フォークは、初心者にとって常に少し気になるようです。実際に何が起こるかというと、あなたが from から戻ると、fork()2つのプロセス (親と子) があり、どちらから戻ったばかりで、次のステートメントを実行しようとしています。fork()

通常のイディオムは、呼び出してから、自分が子プロセス ( ) か親プロセス ( ) かを判断するためint child_pid = fork()にテストし、必要に応じてing またはingを実行することです。child_pidchild_pid == 0child_pid != 0exec()wait()

あなたはこのテストを行っていません。両方のプロセスが両方の動作を実行しようとしています。

それはあなたを正しい軌道に乗せるのに十分なはずです.

編集:私は以下をコンパイルしました:

/**
* @file     msh.c
* @brief    fork/execl example
*/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>

int main(int argc, char* argv[])
{

    int pid;


    if ((pid = fork()) == 0)
    {
        if(strcmp(argv[1], "mycopy") == 0)
        {
            {
                execl("./hello", "./hello", argv[2], argv[3], NULL);
            }
        }

        if(strcmp(argv[1], "myremove") == 0)
        {
            {
                execl("./hello", "./hello", argv[2], NULL);
            }
        }

        if(strcmp(argv[1], "mymove") == 0)
        {
            {
                execl("./hello", "./hello", argv[2], argv[3], NULL);
            }
        }
    }
    else
    {
        wait(NULL);
    }

    return 0;
}

(再編集)と

/**
* @file     hello.c
* @brief    test load for msh
*/

#include <stdio.h>

int main(int argc, char* argv[])
{
    int i;
    for (i = 0; i < argc; i++)
        printf("Argc[%d] = %s\n", i, argv[i]);
    return 0;
}

それは機能するので、おそらく問題は子コードにありますか?

が2 番目の引数を子の としてexecl()渡すことに気付きました。そのため、問題が発生している可能性があります。argv[0]

于 2015-11-19T01:52:17.010 に答える