【发布时间】:2020-04-20 02:13:29
【问题描述】:
我想编写一个程序,将终端传递的参数写入两个名为 (fichier, copie) 的文件。
首先,两个文件中的参数顺序相同,以及使用每个参数的子进程在终端中提供的顺序。
其次,两个文件中的参数顺序相同,尽管它与终端中提供的参数顺序不同。
我已经使用“锁定”编写了下面的代码,以便在两个文件(fichier,副本)中写入每个参数,但似乎我无法将参数写入两个文件中。由于 dup2() 函数,我得到了写入第二个文件(副本)中的所有参数(我认为我的文件描述符有问题)。
如果有人可以向我解释如何清除文件描述符并将参数写入两个文件中,我将非常高兴。
命令: ./try hello haha hene
输出:在“副本”文件中,但“fichier”文件为空
- 88961 一个 ecrit 哈哈
- 88961 一个 ecrit 哈哈
- 88962 一个 ecrit hene
- 88962 一个 ecrit hene
- 88960 一个 ecrit 你好
- 88960 一个 ecrit 你好
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void fils(char *chaine){
int fic1 = open("fichier", O_CREAT|O_APPEND|O_WRONLY,S_IRUSR|S_IWUSR);
lseek(fic1 ,0 ,SEEK_SET);
lockf(fic1 ,F_LOCK,0);
dup2(fic1, 1);
printf("%d a ecrit %s\n",getpid(),chaine);
lseek(fic1 ,0 ,SEEK_SET);
lockf(fic1 ,F_ULOCK,0);
int fic2 = open("copie", O_CREAT|O_APPEND|O_WRONLY,S_IRUSR|S_IWUSR);
lseek(fic2 ,0 ,SEEK_SET);
lockf(fic2 ,F_LOCK,0);
dup2(fic2, 1);
printf("%d a ecrit %s\n",getpid(),chaine);
int attente=rand()%2;
fprintf(stderr,"%d attente de %d dans fichier et copie\n",getpid(),attente);
sleep(attente);
lseek(fic2 ,0 ,SEEK_SET);
lockf(fic2 ,F_ULOCK,0);
close(fic1);
close(fic2);
exit(EXIT_SUCCESS);
}
int main(int argc,char **argv){
int i;
pid_t pid;
system("rm -f fichier copie");
for(i=1;i<argc;i++){
if((pid=fork())<0){
printf("Erreur fork\n");
exit(EXIT_FAILURE);
}else if(pid==0){
fils(argv[i]);
}
}
exit(EXIT_SUCCESS);
}
【问题讨论】:
-
我很难理解你在问什么,但我认为你完全误解了
dup2函数的作用。它似乎对您的问题一点用处都没有。 -
我也不明白你认为
lockf在这里做了什么。
标签: c process locking fork ipc