练习很简单。父进程让我在文件中写下我的姓名。子进程等待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秒,它显示文件内容(基本上是随机字符)。
答案 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
)。因此,您可以看到“父亲存在”消息,并在子项将显示任何输出之前获取控制台提示。