23,125
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
#include <signal.h>
#define MODE S_IRUSR|S_IWUSR
void out_file(int fd,char *s);
struct flock flockbuff;
static volatile int sigflag;
static sigset_t newmask, oldmask,zeromask;
static void sig_usr(int signo)
{
sigflag = 1;
}
void TELL_WAIT(void)
{
if (signal(SIGUSR1, sig_usr) == SIG_ERR)
{
printf("signal1 error!\n");
}
if (signal(SIGUSR2, sig_usr) == SIG_ERR)
{
printf("signal2 error!\n");
}
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGUSR1);
sigaddset(&newmask, SIGUSR2);
if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
{
printf("sigprocmask error!");
}
}
void TELL_PARENT(pid_t pid)
{
kill(pid, SIGUSR2);
}
void TELL_CHILD(pid_t pid)
{
kill(pid, SIGUSR1);
}
void WAIT_PARENT( void )
{
while (sigflag == 0)
{
sigsuspend(&zeromask);
}
sigflag = 0;
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
{
printf("SIG_SETMASK error!\n");
}
}
void WAIT_CHILD( void )
{
while (sigflag == 0)
{
sigsuspend(&zeromask);
}
sigflag = 0;
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
{
printf("SIG_SETMASK error!\n");
}
}
int main(int argc,char *argv[])
{
int status;
if(argc < 2)
{
fprintf(stderr,"usage:%s file\n",argv[0]);
exit(1);
}
int fd = open(argv[1],O_CREAT|O_WRONLY,MODE);
if(fd<0)
{
fprintf(stderr,"open:%s\n",strerror(errno));
exit(1);
}
memset(&flockbuff,0,sizeof(flockbuff));
flockbuff.l_type = F_WRLCK;
flockbuff.l_start = 0;
flockbuff.l_whence = SEEK_SET;
flockbuff.l_len = 0;
TELL_WAIT();
pid_t pid = fork();
if(pid <0)
{
fprintf(stderr,"fork:%s\n",strerror(errno));
}
else if(pid > 0)
{
WAIT_CHILD();
char *d ="AAAAAAAAAA";
out_file(fd,d);
TELL_CHILD(pid);
WAIT_CHILD();
}
else if(pid == 0)
{
if(flockbuff.l_type == F_WRLCK)
{
printf("write\n");
}
char *d= "aaaaaaaaaa";
out_file(fd,d);
//sleep(10);
TELL_PARENT(getppid());
WAIT_PARENT();
TELL_PARENT(getppid());
}
}
void out_file(int fd,char *s)
{
int i = 0;
if(fcntl(fd,F_SETLKW,&flockbuff)<0)
{
fprintf(stderr,"fcntl:%s\n",strerror(errno));
exit(1);
}
for(;i<strlen(s);i++)
{
write(fd,s+i,sizeof(char));
//sleep(1);
}
close(fd);
}
运行结果:
[root@localhost work1]# gcc 1.c -o 1 -lpthread
[root@localhost work1]# ./1 7.txt
write
[root@localhost work1]# cat 7.txt
aaaaaaaaaaAAAAAAAAAA[root@localhost work1]#
看见没?都写进去了