0

私はシェルをシミュレートするプログラムを持っています。私はバックグラウンドでの実行を作成しています。FORK -> EXEC で別のプロセスを実行すると、それでも時々入力 (コンテキスト スイッチまたは smthng) を取得します。自分からプロセスを完全にブロックしたいシェルは、Linux の & 演算子とまったく同じようにします。シグナルを使用したソリューションを探していますが、それを行う方法が見つかりません。助言がありますか?

            if((son = fork())==0){//son process
            getcwd(cur, 1024);
            strcat(cur, "/");
            strcat(cur, tokens_set[0]);
            tokens_set[0] = cur;
            i = execvp(tokens_set[0],tokens_set); //run the command
            if(i == (-1)){
                perror("couldn't find the command: ");
            }
            exit(0);

        }else{ // father process

            printf("and father proccess goes on\n");
        }

その後、父のプロセスが続き、息子のプロセスは単に入力の取得->同じプログラムの出力です。私の場合、父親が情報を得る場合もあれば、息子が情報を得る場合もあります。また、valgrind で実行すると、息子は常に入力を取得します。

4

1 に答える 1

1

子プロセスが入力を取得できないようにします。dup2子プロセスでstdinをnullにリダイレクトしてみてください。

int fd = open("/dev/null", O_RDONLY);
dup2(fd, STDIN_FILENO);
close(fd);
于 2013-11-14T18:42:55.400 に答える