-1

エクササイズは簡単です。父親プロセスでは、自分の名前と姓をファイルに書き込むことができます。son プロセスは 5 秒間待ってから、それを読み取って表示します。機能が使えません#wait()

#include <cstdlib>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char** argv) {
    char name[20];
    char surname[20];
    char outp[50];

    // The file pointer   
    FILE *file;
    // Open the file in write mode
    file = fopen("dati.txt", "w+");

    pid_t pid;
    pid=fork();
    if(pid>0){
        printf("Father");
        printf("Insert name: ");
        scanf("%s",name);

        for (int i=0; i<strlen(name); i++) {
            if (i==0) {
                if (name[i]>='a' && name[i]<='z')
                    name[i]-=32;
            } else {
                if (name[i]>='A' && name[i]<='Z')
                    name[i]+=32;
            }
        }

        printf("Insert surname: ");
        scanf("%s", surname); 

        for (int i=0; i<strlen(name); i++){
            if (i==0){
                if (surname[i]>='a' && surname[i]<='z')
                    surname[i]-=32;
            } else {
                if (surname[i]>='A' && surname[i]<='Z')
                    surname[i]+=32;
            }
        }
        fputs(name, file);
        fputs(" ",file);
        fputs(surname, file);
        printf("Father exits");
        fclose(file);
        exit(0);
    }else{
        sleep(5);
        // position to the start of the file
        rewind(file);    
        fgets(outp, 50, file);
        printf("Read string: %s", outp);        
        fclose(file);
        exit(0);
    }
    return 0;
}

名前と姓を 5 秒より前に挿入すると、プログラムはそれらを書き込みますが、表示しません。それ以外の場合は、名前を書いて「偶然」5 秒待つと、ファイルの内容 (基本的にランダムな文字) が表示されます。

4

2 に答える 2

4

メイン プロセスでファイルを閉じてから、子プロセスで同じポインタを再利用したいとします。これは不可能です。子プロセスでファイルを再度開く必要があります。

したがって、sleep()呼び出しの後にこれを記述する必要があります。

file = fopen("dati.txt", "r");

#rewind()ファイルの先頭に戻るため、関数呼び出しも必要ありません。

更新:問題はそれがw+意味することでした

write/update: 空のファイルを作成し、更新のために開きます

だから、あなたのファイルは消去されました。モードを使用rすると、問題なく動作します。

PS: ところで、cstdioC プログラムでは使用しないでください。標準のstdio.hヘッダー ファイルのみを使用してください。ループ変数を再宣言しているため、コンパイル エラーも発生しましたi

于 2015-02-09T15:07:19.383 に答える
0

親と子の両方の後にfopen別々にファイルする必要があります。 fork()

if (pid > 0) {
    /* Parent process */
    file = fopen("dati.txt", "w+");
    /* write to file */
    ...
} else {
    /* child process */
    sleep(5);
    file = fopen("dati.txt", "r");
    /* read from file */
    ...
}

この変更により、動作します。親プロセスのみがアクティブにコンソールに接続されていることに注意してください - child の出力は 5 秒後に表示され、親プロセスが終了した後に表示される場合があります ( への呼び出しがないためwait)。したがって、「父が存在します」というメッセージが表示され、子が出力を表示する前にコンソール プロンプトが表示されます。

于 2015-02-09T16:52:02.983 に答える