0
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MAXLINE 512
main(int argc,char* argv[]){
    int k;
    for (k=0; k<=argc; k++) {
        if (k%2==0) {
            if (fork()==0){

    FILE *fi;
    FILE *fo;
    int i;
    fi=fopen(argv[k], "r");
    fo=fopen("temp.txt","w");
    if (!fi)
        return;
    char linie[MAXLINE],*p;
    for ( ; ; ) {
        p = fgets(linie, MAXLINE, fi);
        if (p == NULL)
            break;
        linie[MAXLINE-1] = '\0';
        int k=-1;
        for (i = 0; i <MAXLINE; i++) {
            if (linie[i]=='\n') k=i;
        }
        for (i = k; i >= 0; --i) {
            fprintf(fo,"%c", linie[i]);
        }
    }
    fclose(fi);
    fclose(fo);
                exit(1);}
        }
else
{
    if (fork()==0){
        execl("/usr/bin/awk","awk","-f","ouk.awk",argv[k],NULL);
        exit(1);
    }

}
    }

    };

これがouk.awkファイルの内容です

{ for (i=NF;i>=1;i--){ if(s){s=s" "$i} else{s=$i }}{print s;s=""}}

基本的に私がやろうとしているのは、いくつかの argc プロセスを作成することであり、その数はファイル内のテキストをミラーリングすることでもあり、すべての行から単語を後方に再配置しない場合、私が直面している問題は

fprintf(fo,"%c",line[j])

が機能しておらず、awk スクリプトを実行しようとするとエラーが発生する

awk: can't open file >
 input record number 6, file >
 source line number 1

同じファイルを使用してターミナルでawkコマンドのみを実行すると、完全に機能するため、execlコマンドと関係がある必要があります。

もう1つ、次のコマンドを試してtemp.txt int argv [k]の名前を変更しました

execl("bin/mv","temp.txt",argv[k],NULL)

しかし、それはクラッシュします。

誰かが私を助けたり、良いexec cコマンドチュートリアルへのリンクを教えてくれたりしたら、それは素晴らしいことです、どうもありがとう

4

1 に答える 1

1

forループが配列の境界を超えています (これは未定義の動作です) 。

for (k=0; k<=argc; k++) {
    /* ...snip... */
    fi=fopen(argv[k], "r");

配列にはゼロベースのインデックスがあるため、 から0までN-1N配列内の要素の数です。の終了条件fork < argc. さらに、 の最初の要素argvは、除外するプログラムの名前です。

for (k = 1; k < argc; k++)

呼び出すときexecl()は、最後の引数を次のようにキャストする必要がありますchar*

execl("/usr/bin/awk","awk","-f","ouk.awk",argv[k], (char*)NULL);
于 2013-04-15T10:56:52.847 に答える