2

私は C プログラミングを学び始めたばかりfork()で、exec()pipe()、 などについて不安があります。

このコードを開発しましたが、実行すると変数cが空のままなので、子がパイプに書き込んでいないのか、親がパイプから読み取っていないのかわかりません。

私を手伝ってくれますか?これはコードです:

int main() {
int pid=0;
int pipefd[2];
char* c=(char *)malloc(sizeof(char));   
FILE *fp;

pipe(pipefd);

pid=fork();

if (pid==0){
    close(pipefd[0]);
    dup2(pipefd[1],1);
    close(pipefd[1]);
    execl("ls -l | cut -c28","ls -l | cut -c28", (char *) 0);
}
else{

    close(pipefd[1]);
    read(pipefd[0], c, 1);
    char* path="/home/random";
    char* txt=".txt";
    char* root=malloc(strlen(path) + strlen(txt) + sizeof(char));
    strcpy(root,path);
    strcat(root,c);
    strcat(root,txt);
    close(pipefd[0]);

    fp=fopen(root,"w+");
    (...)
}

問題は、最終的なルート文字列"/home/random.txt"が charcに何もないという理由だけであり、私が望むのはファイルを開くことです"/home/random(number stored in char c).txt"

4

3 に答える 3

1

execl単一のコマンドを実行し、パイプなどのシェルの概念を認識しません。シェル コマンドを実行する場合は、次のようにシェルを実行する必要があります。

execl("/bin/sh","/bin/sh","-c","ls -l | cut -c28", (char*) 0);
于 2012-09-21T15:32:41.293 に答える
1

execve(2)システム コール ( や のような派生関数) の戻り値を常にチェックしexecl(3)、 を使用しerrno(3)て何が問題なのかを突き止めます。

あなたの場合、execl回線は失敗します。

于 2012-09-21T15:33:52.417 に答える
0

strcpy/strcat の使用は、少し複雑すぎるようです。snprintf は、これらの 3 行を 1 行に変換できます。

snprintf( root, size_of_buf, "/home/random%s", c );

さらに、エラー コードを確認します。前述のように、execl は失敗しており、あなたはそれを知りません。fork、dup2、...、も失敗する可能性があります。後でではなく早く知りたいです。

于 2012-09-21T15:38:44.220 に答える