日期:2014-05-16 浏览次数:20980 次
#include <stdio.h>
#include <time.h>
#include <signal.h>
#include <stdlib.h>
pid_t pid,ppid;
void handle(int signo) {
int i=0;
time_t now;
if (signo==SIGUSR1) {
for (i=0;i<3;i++) {
time(&now);
printf("%s", ctime(&now));
sleep(1);
}
}
if (signo==SIGUSR2) {
printf("Current time:\n");
kill(pid, SIGUSR1);
}
}
int main() {
int i;
int stat;
signal(SIGCLD,SIG_IGN);
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, handle);
pid=fork();
if (pid<0) {
perror("fork");
exit(-1);
} else if (pid==0) {
signal(SIGUSR1, handle);
signal(SIGUSR2, SIG_IGN);
ppid=getppid();
for (i=0;i<5;i++) {
kill(ppid, SIGUSR2);
pause();
}
exit(0);
}
wait(&stat);
return 0;
}
------解决方案--------------------
你改句话就明白了
printf("Current time: %d\n",pid);
------解决方案--------------------
好像是这个样子:
如果pid作全局变量,那么父子进程引用的是同一个地址空间
如果父进程先运行,子进程后运行,子进程在父进程后从fork返回,pid值就为0
pid中的地址就是后调度的进程从fork的返回值
局部变量在栈中分配,用不同的地址空间,就不会有这个问题
if(signo==SIGUSR2){
printf ("pid = %i , addr = %x\n", pid,&pid);
printf("Current time:\n");
fflush(0);
kill(pid,SIGUSR1); //如果pid为0,那么发信号给当前进程组,所以会输出两次
}
------解决方案--------------------
你代码有两个问题:
1. 进程同步
2. 使用了printf输出,printf输出只是将内容输出到缓冲区中,不能保证能够即时输出。
------解决方案--------------------
问题应该出在写时复制(Copy-On-Write)上,引用一段关于写时复制的描述:
现在的Unix内核(包括Linux),采用一种更为有效的方法称之为写时复制(或COW)。这种思想相当简单:父进程和子进程共享页面而不是复制页面。然而,只要页面被共享,它们就不能被修改。无论父进程和子进程何时试图写一个共享的页面,就产生一个错误,这时内核就把这个页复制到一个新的页面中并标记为可写。原来的页面仍然是写保护的:当其它进程试图写入时,内核检查写进程是否是这个页面的唯一属主;如果是,它把这个页面标记为对这个进程是可写的。