修改 程序,改为向文件中打印输出。再给三个进程加锁、解锁,其中lockf()的参数1改为*fp,如lockf(*fp,10),观察并分析出现的结果int main() { int p1,p2; int i =0; while( (p1=fork())==-1): if(p1==0){ lockf (1,1,0); for(t=0;1<10;1++){ Prtntf. ("daughter ydln”,t):1 lockf(1,1,0);} else{ while((p2=fork())==-1): 1f (p2==0){ lockf(1,1,°): for(t=0;tx10;t++){ PrtntfC"son sd in, t):3 lockf (1,1,0) }else{ lockf (1,1,0);
时间: 2023-08-20 09:07:19 浏览: 105
PHP实现对文件锁进行加锁、解锁操作的方法
为了将输出结果写入文件中,我们需要将 printf 函数改为 fprintf 函数,并指定输出文件的文件指针。
另外,我们需要使用 fopen 函数打开文件,并以写入模式打开,然后将文件指针传递给 lockf 函数中。最后使用 fclose 函数关闭文件。
修改后的程序如下:
```c
#include <stdio.h>
#include <unistd.h>
int main() {
FILE *fp = fopen("output.txt", "w");
int p1, p2;
int t = 0;
while ((p1 = fork()) == -1)
;
if (p1 == 0) {
lockf(fileno(fp), F_LOCK, 0);
for (t = 0; t < 10; t++) {
fprintf(fp, "daughter ydln %d\n", t);
lockf(fileno(fp), F_ULOCK, 0);
lockf(fileno(fp), F_LOCK, 0);
}
} else {
while ((p2 = fork()) == -1)
;
if (p2 == 0) {
lockf(fileno(fp), F_LOCK, 0);
for (t = 0; t < 10; t++) {
fprintf(fp, "son sd in %d\n", t);
lockf(fileno(fp), F_ULOCK, 0);
lockf(fileno(fp), F_LOCK, 0);
}
} else {
lockf(fileno(fp), F_LOCK, 0);
for (t = 0; t < 10; t++) {
fprintf(fp, "father ftns %d\n", t);
lockf(fileno(fp), F_ULOCK, 0);
lockf(fileno(fp), F_LOCK, 0);
}
}
fclose(fp);
}
return 0;
}
```
在这个程序中,我们打开了一个名为 "output.txt" 的文件,并以写入模式打开。我们使用 fprintf 函数将输出结果写入文件中。在每次输出后,我们使用 lockf 函数对文件进行加锁,以确保多个进程不会同时写入文件,从而导致输出结果混乱。在每次加锁之后,我们使用 fprintf 函数输出结果,并使用 lockf 函数解锁文件。最后,我们使用 fclose 函数关闭文件。
需要注意的是,lockf 函数的第一个参数应该是文件指针所对应的文件描述符,而不是文件指针本身。因此,我们使用 fileno 函数获取文件指针对应的文件描述符。
在这个程序中,我们将 lockf 函数的第三个参数都设置为 0,表示对整个文件进行加锁。如果需要对文件的某个部分进行加锁,可以将第三个参数设置为需要加锁的字节数。
当运行这个程序时,我们会发现输出结果被写入了 "output.txt" 文件中,而不是直接输出到终端。同时,我们会发现每个进程的输出结果都被正确地互相隔离,不会混淆在一起。这是因为我们使用 lockf 函数对文件进行了加锁和解锁,确保了多个进程不会同时写入文件。
阅读全文