不同进程直接不同步或者通信就会产生竞争关系。
下面是一个父子进程同时输出,没有进行同步处理
static void print(char *str)
{
char *ptr;
char c;
setbuf(stdout , NULL);
for(ptr = str ;(c = *ptr++) != 0 ;){//这句for循环,先初始化ptr,然后利用c等于一个值,++的情况处理,既可以遍历,也可以输出.
putc(c , stdout);
sleep(1);//睡觉一秒
}
}
int main(void)
{
pid_t pid;
if((pid = fork()) < 0)
err_sys("fork error\n");
else if(pid == 0){
print("child ouput\n");
}else{
print("parent ouput\n");
}
exit(0);
}
pcahirelnd to oupuuput //输出相互干扰,毫无逻辑。必须加上通信机制
t
按 来关闭窗口…
sigset_t newmask , oldmask , waitmask;
volatile sig_atomic_t sigflag = 0;
static void sig_int(int signo)
{
sigflag = 1;//信号已经到达,可以同步了
}
void tell_wait(void)
{
if(signal(SIGUSR1 , sig_int) == SIG_ERR)//注册信号
err_sys("signal(SIGUSR1) error");
if(signal(SIGUSR2 , sig_int) == SIG_ERR)//注册信号
err_sys("signal(SIGUSR2) error");
sigemptyset(&newmask);
sigaddset(&newmask , SIGUSR1);
sigaddset(&newmask , SIGUSR2);
sigemptyset(&waitmask);//
if(sigprocmask(SIG_BLOCK , &newmask , &oldmask) < 0)//屏蔽INT信号
err_sys("SIG_BLOCK err");//屏蔽这两个信号,因为此处单独用作进程通信使用.
}
void tell_parent(pid_t pid)
{
kill(pid , SIGUSR2);
}
void wait_parent(void)
{
while (sigflag == 0)
sigsuspend(&waitmask);
sigflag = 0;
if(sigprocmask(SIG_SETMASK , &oldmask , NULL) < 0)//恢复INT信号
err_sys("SIG_SETMASK error");
}
void tell_child(pid_t pid)
{
kill(pid , SIGUSR1);
}
void wait_child(void)
{
while (sigflag == 0)
sigsuspend(&waitmask);
sigflag = 0;
if(sigprocmask(SIG_SETMASK , &oldmask , NULL) < 0)//恢复INT信号
err_sys("SIG_SETMASK error");
}
static void print(char *str)
{
char *ptr;
char c;
setbuf(stdout , NULL);
for(ptr = str ;(c = *ptr++) != 0 ;){//这句for循环,先初始化ptr,然后利用c等于一个值,++的情况处理,既可以遍历,也可以输出.
putc(c , stdout);
sleep(1);//睡觉一秒
}
}
int main(void)
{
pid_t pid;
tell_wait();
if((pid = fork()) < 0)
err_sys("fork error\n");
else if(pid == 0){
wait_parent();
print("child ouput\n");
}else{
print("parent ouput\n");
tell_child(pid);//这里父进程先运行
}
exit(0);
}
parent ouput
按 来关闭窗口…//因为父进程先退出了
child ouput