0

タイトルがややこしいかもしれませんので、説明させてください。プログラミングを練習するために簡単なシェルを作成しようとしています。コマンド、フォーク、実行ループの取得が機能しています。ただし、子プロセスがまだ実行されているときに押すCTRL-Cと、子プロセスではなくシェルが終了します(ただし、子プロセスは実行され続けます)。主な機能は次のとおりです。

int main()
{
    dynarray *args; /* pointer to a dynamic array */
    int bytes_read;
    size_t nbytes = 0;
    char *command;
    pid_t pid;
    printf("Enter command: ");
    while ((bytes_read = getline(&command, &nbytes, stdin)) != -1) {
        if (bytes_read == -1) {
            perror("getline");
            exit(EXIT_FAILURE);
        }
        pid = fork();
        if (pid == -1) {
            perror("fork");
            exit(EXIT_FAILURE);
        }
        else if (pid == 0) { /* child process */
            args = newdynarray();
            char *arg = strtok(command, " \n");
            while (arg != NULL) {
                addstring(args, arg);
                arg = strtok(NULL, " \n");
            }
            if (args->nval == 0) {
                freedynarray(args);
                continue;
            }

            addstring(args, NULL);
            char *fullpath = find_executable(args->strings[0]);
            if (fullpath == NULL) {
                fprintf(stderr, "Couldn't find executable: %s\n", command);
                exit(EXIT_FAILURE);
            }
            if (execv(fullpath, args->strings) == -1) {
                perror("execv");
                exit(EXIT_FAILURE);
            }
        } else {
            int status;
            waitpid(pid, &status, 0);
        }
        printf("Enter command: ");
    } 
    return 0;
}

他の部分は関係ないと思うので含めませんでした。子プロセスが終了するまで stdin からのすべての入力をキャッチするにはどうすればよいですか?

4

2 に答える 2

1

SIGINT親プロセスにシグナルハンドラーを登録し、その中kill(2)で子プロセスにシグナルを送信するために使用できます。子プロセスの PID をどこかに保存する必要があります。

于 2012-05-20T11:10:17.847 に答える
0

How can I make my child process catch all the input from stdin until it terminates?標準入力キー (コントロール C など) から生成されたシグナルは、標準入力を使用する最後のプロセスに送信されるため、子供にパスを使用させることができない限り、何もできません。

代わりに、シェルプロセスでシグナルハンドラーを作成して SIGINT (およびその他) をキャッチし、(kill()関数を使用して) シグナルを受け取りたいプロセスに再送信する必要があります。

于 2012-05-20T11:11:44.260 に答える