- 论坛徽章:
- 0
|
写了个简单的测试管道功能的代码,结果让我百思不得其解。
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#define MAXLEN 1024
static void sig_handler(int signo);
int main()
{
pid_t pid;
int fd[2];
char buf[MAXLEN];
int cnt=0;
int i=0;
if(pipe(fd)<0)
perror("pipe error!");
if(signal(SIGCHLD,sig_handler)==SIG_ERR)
perror("signal error!");
for(i=0;i<=1;i++)
{
if((pid=fork())<0)
perror("fork error!");
else if(pid==0)
{
close(fd[0]);
cnt++;
sprintf(buf,"%d\n",cnt);
write(fd[1],buf,MAXLEN);
exit(0);
}
else
{
close(fd[1]);
read(fd[0],buf,MAXLEN);
printf("buf %s\n",buf);
cnt=atoi(buf);
printf("cnt %d\n",cnt);
}
}
return 0;
}
static void sig_handler(int signo)
{
pid_t pid;
if((pid=waitpid(-1,NULL,WNOHANG))<0)
perror("waitpid error!");
return ;
}
编译:
[root@localhost exercise]# gcc -Wall -g -o pipe2 pipe2.c
[root@localhost exercise]# ./pipe2
buf 1
cnt 1
buf 1
cnt 1
第二次读出的值为什么还是1.想不明白?
而我修改下,去掉子进程的exit后,
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#define MAXLEN 1024
static void sig_handler(int signo);
int main()
{
pid_t pid;
int fd[2];
char buf[MAXLEN];
int cnt=0;
int i=0;
if(pipe(fd)<0)
perror("pipe error!");
if(signal(SIGCHLD,sig_handler)==SIG_ERR)
perror("signal error!");
for(i=0;i<=1;i++)
{
if((pid=fork())<0)
perror("fork error!");
else if(pid==0)
{
close(fd[0]);
cnt++;
sprintf(buf,"%d",cnt);
write(fd[1],buf,MAXLEN);
//exit(0);
}
else
{
close(fd[1]);
read(fd[0],buf,MAXLEN);
printf("buf %s\n",buf);
cnt=atoi(buf);
printf("cnt %d\n",cnt);
}
}
return 0;
}
static void sig_handler(int signo)
{
pid_t pid;
if((pid=waitpid(-1,NULL,WNOHANG))<0)
perror("waitpid error!");
return ;
}
编译为
[root@localhost exercise]# gcc -Wall -g -o pipe2 pipe2.c
[root@localhost exercise]# ./pipe2
buf 1
cnt 1
buf 1
cnt 1
buf 2
cnt 2
感觉好奇怪:gdb pipe2发现刚执行到fork时就打印前两行,后面那四行发现用能读出增加后的cnt值。
[root@localhost exercise]# uname -a
Linux localhost.localdomain 2.6.18.8 #1 SMP Tue Feb 24 14:47:02 CST 2009 i686 i686 i386 GNU/Linux |
|