在叉子里写作和阅读 - C

时间:2015-02-09 15:05:21

标签: c fork fgets fputs

练习很简单。父进程让我在文件中写下我的姓名。子进程等待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秒之前插入姓名,程序会写入,但不会显示它们。否则,如果我写了这个名字并且&#34;意外地&#34;等待第5秒,它显示文件内容(基本上是随机字符)。

2 个答案:

答案 0 :(得分:4)

您正在关闭主进程中的文件,然后您想在子进程中重用相同的指针。这是不可能的。您需要在子进程中重新打开该文件。

所以,你需要在sleep()电话之后写这个:

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

您也不会需要#rewind()函数调用,因为您将返回文件的开头。

更新:问题在于w+表示

  

写入/更新:创建一个空文件并将其打开以进行更新

所以,你的文件被删除了。使用r模式,它可以正常工作。

PS:顺便说一下,你不应该在C程序中使用cstdio,只使用标准的stdio.h头文件。还有一个编译错误,因为您正在重新声明循环变量i

答案 1 :(得分: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 */
    ...
}

通过此更改,它将起作用。请注意,只有父进程主动连接到您的控制台 - 子进程的输出将在5秒后显示,并且可能在父进程退出后出现(由于没有调用wait)。因此,您可以看到“父亲存在”消息,并在子项将显示任何输出之前获取控制台提示