0

C プログラムで単純な「cat file1 > file1」コマンドを実装したいと考えています。以下を試してみましたが、うまくいきません...

main () {
    pid_t pid;
    FILE *ip, *op;
    char *args[3];
    printf("Name of the executable program\n\t");
    scanf("%s", &name[0]); // I entered cat here
    printf("Name of the input file\n\t");
    scanf("%s", &name[1]); //file1.txt
    printf("Name of the output file\n\t");
    scanf("%s", &name[0]); //file2.txt
    pid = fork();
    if(pid == -1)
        perror("fork() error");
    else if(pid > 0)
        waitpid(-1, NULL, 0);
    else if (pid == 0) {
        op = fopen(name[2], "w");
        close(1);
        dup(op);
        execlp(name[0], name[1], NULL);
        }
    return 0;
    }// end of main()

execlp()が実行cat file1.txtされ、その出力が にリダイレクトされると思っていましたfile2.txtが、そうではなく、理由もわかりません。どうすればいいのですか?

4

3 に答える 3

1

の最初の引数execlp()は、検索する名前です。2 番目以降の引数は、argvで始まるリストargv[0]です。

int execlp(const char *file, const char *arg0, ... /*, (char *)0 */);

open()シェル I/O リダイレクトの場合、標準 I/O (<stdio.h>およびFILE *)を使用するよりも、でファイルを開く方が簡単です。の後に開いたファイルも閉じる必要がありますが、dup()使用する方が簡単ですdup2()。文字列を読み取るためのスペースを割り当てる必要があります。str多くのシステムでは、ポインターがどこも指していないため、元のコードがクラッシュします。通常は、すべてが機能した場合にのみ、ステータス 0 で終了することを目指してください。それ以外の場合は、ゼロ以外の終了ステータスで終了します。

これはにつながります:

#include <fcntl.h>      /* open() */
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>   /* waitpid() */
#include <unistd.h>     /* execlp(), fork(), dup2() */

int main(void)
{
    pid_t pid;
    pid_t corpse;
    int   status;
    char  name[3][50];
    printf("Name of the executable program\n\t");
    if (scanf("%49s", name[0]) != 1)
        return(EXIT_FAILURE);
    printf("Name of the input file\n\t");
    if (scanf("%49s", name[1]) != 1)
        return(EXIT_FAILURE);
    printf("Name of the output file\n\t");
    if (scanf("%49s", name[2]) != 1)
        return(EXIT_FAILURE);
    pid = fork();
    if (pid == -1)
    {
        perror("fork() error");
        return(EXIT_FAILURE);
    }
    else if (pid > 0)
        corpse = waitpid(-1, &status, 0);
    else
    {
        int fd = open(name[2], O_WRONLY|O_CREAT|O_EXCL, 0644);
        if (fd < 0)
        {
            fprintf(stderr, "Failed to open %s for writing\n", name[2]);
            return(EXIT_FAILURE);
        }
        dup2(fd, 1);
        close(fd);
        execlp(name[0], name[0], name[1], NULL);
        fprintf(stderr, "Failed to exec %s\n", name[0]);
        return(EXIT_FAILURE);
    }
    return(corpse == pid && status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
}
于 2012-08-13T05:35:15.237 に答える
1
scanf("%s", &name[0]); // I entered cat here
printf("Name of the input file\n\t");
scanf("%s", &name[1]); //file1.txt
printf("Name of the output file\n\t");
scanf("%s", &name[0]); //file2.txt

明らかに実際のコードの C&P ではありnameませargsん。

また、dup は FILE* ではなくファイル記述子で動作するため、fopen ではなく open を確認するか、FILE* から fd を取得する方法を確認する必要があります。

于 2012-08-13T03:07:39.193 に答える
0

fork() プロセスを使用して、そのファイル記述子を以前に (手動で) open() したファイルに再割り当てするか、system() 呼び出しを使用してシェルに処理させる必要があります。

于 2012-08-13T03:13:29.430 に答える