2016-06-24 8 views
-3

Linuxの場合新しく作成されたプロセスに可変引数を渡す

私はtemp.cファイルを持っています。その中で私は、新しいプロセスを作成し、私はその

int main (int argc, char *argv[]) 
{ 
    if((cid1 = fork()) == 0) //child1 
    { 
     res = execv(proc1, &argv[1]); 
    } 
} 

にすべての引数を渡す必要がある今、私はこれをコンパイルして

./a.out "arg1 arg2 arg3" 

として実行し、今は新しいプロセスにこのARG1、ARG2とARG3を渡したいです私はそれのargcチェックしたときに作成されますが、その内側には、私に2代わりの4

この不一致が起こるとPROC1内で私は値が"arg1 arg2 arg3"であるが、ここで私はそうargv[1] = arg1, argv[2]=arg2, argv[3]=arg3 3引数をしたいだけ1引数を持っている理由を示し、

これを実現するには?

+0

最初のプログラムを間違って呼び出すように聞こえるかもしれません。最初のプログラムで 'argc'を印刷しようとしましたか?それは4でなければなりませんが、あなたが見ていることを考えれば、それが2であれば私は驚くことはありません。 –

+4

これはまさに私が期待していたものです。あなたは一つの引数を最初のプログラムに渡しています。これは 'arg1 arg2 arg3'です。同じ引数を変更せずに2番目のプログラムに渡します。コマンドラインから引用符を削除してみてください。そうすれば、彼らは別々の引数として渡されます。 –

+0

Actulay実際には3つのプロセスと3つの引数が二重引用符でグループ化されているので、二重引用符を使用する必要があります。 –

答えて

2
https://support.sas.com/documentation/onlinedoc/sasc/doc/lr2/execv.htm

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

main() 
{ 
    pid_t pid; 
    char *const parmList[] = {"/bin/ls", "-l", "/u/userid/dirname", NULL}; 

    if ((pid = fork()) == -1) 
     perror("fork error"); 
    else if (pid == 0) { 
     execv("/bin/ls", parmList); 
     printf("Return not expected. Must be an execv error.n"); 
    } 
} 

非常に有用な例あなたはEXECVを見ることができるように()の二つの引数を受け入れます。最初は実行可能ファイル名です。 2番目はヌルで終わる文字列へのポインタの配列へのポインタで、NULLポインタは配列の終わりを示すために使われます。

新しいchar *配列を作成し、最初の要素(インデックス0)にproc1を割り当て、次の要素に必要なパラメータを割り当てます。

関連する問題