死活进不了子进程

houzhenghui123 2012-05-25 12:42:59
最近在unix环境高级编程,在信号那一章节有一个练习题:
代码如下,代码进不了在注释,求原因,小菜在这里谢谢了


#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef void (*Sigfunc)(int);


/*****************************************
*local var
****************************************/
static volatile sig_atomic_t sigflag;
static sigset_t newmask, oldmask, zeromask;

/******************************************
*extern function declare
******************************************/
Sigfunc signal(int signo, Sigfunc sigfun);
void TELL_WAIT(void);
void TELL_PARENT(pid_t pid);
void WAIT_PARENT(void);
void TELL_CHILD(pid_t pid);
void WAIT_CHILD(void);

/*****************************************
*local function declare and implement
*****************************************/
static void sig_usr(int signo){
sigflag = 1;
}
/******************************************
*extern function implement
*****************************************/
void TELL_WAIT(void){
if( signal(SIGUSR1, sig_usr) == SIG_ERR)
;
if( signal(SIGUSR2, sig_usr) == SIG_ERR)
;
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGUSR1);
sigaddset(&newmask, SIGUSR2);
if(sigprocmask(SIG_BLOCK, &newmask, &oldmask)<0)
;
}
void TELL_PARENT(pid_t pid){
kill(pid, SIGUSR2);
}
void WAIT_PARENT(void){
while(sigflag == 0)
sigsuspend(&zeromask);
sigflag = 0;
if(sigprocmask(SIG_SETMASK, &oldmask, NULL)<0)
;
}
void TELL_CHILD(pid_t pid){
kill(pid, SIGUSR2);
}
void WAIT_CHILD(void){
while(sigflag == 0)
sigsuspend(&zeromask);
sigflag = 0;
if(sigprocmask(SIG_SETMASK, &oldmask, NULL)<0)
;
}

Sigfunc signal(int signo, Sigfunc sigfun){
struct sigaction act, oact;
act.sa_handler = sigfun;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if(signo == SIGALRM){
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
printf("[signal sysnc] defined SA_INTERRUPT\n");
#endif
}else{
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART;
printf("[Signal Sysnc] defined SA_RESTART\n");
#endif
}
if(sigaction(signo, &act, &oact)<0)
return SIG_ERR;
return oact.sa_handler;
}

static volatile int i = 0;
int main(void)
{
pid_t pid;
int fd;
char buf[512];
if((fd = open("./temp.file", O_CREAT | O_TRUNC | O_WRONLY, 0644))<0)
;
sprintf(buf, "%d", i);
write(fd, buf , strlen(buf));
if((pid = fork())<0){
fprintf(stderr, "fork error\n");
return -1;
}else if(0 == pid){
int j;
printf("enter child\n");
for(j = 0; j<100; j++){ ///死活都进不了这里////
WAIT_PARENT();
++i;
sprintf(buf, "%d", i);
write(fd, buf , strlen(buf));
printf("child:%d\n", i);
TELL_PARENT(getppid());

}
exit(0);
}else{
printf("enter parent\n");
TELL_CHILD(pid);
while(i != 100){
WAIT_CHILD();
++i;
sprintf(buf, "%d", i);
write(fd, buf , strlen(buf));
printf("parent:%d\n", i);
TELL_CHILD(pid);
}
}
return 0;
}

...全文
81 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
houzhenghui123 2012-05-25
  • 打赏
  • 举报
回复
最近up下!
houzhenghui123 2012-05-25
  • 打赏
  • 举报
回复
蛋疼,还有拼写错误
代码进不了在注释,求原因,小菜在这里谢谢了
->代码进不了在注释那个地方,求原因,小菜在这里谢谢了
帅得不敢出门 2012-05-25
  • 打赏
  • 举报
回复

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef void (*Sigfunc)(int);


/*****************************************
*local var
****************************************/
static volatile sig_atomic_t sigflag;
static sigset_t newmask, oldmask, zeromask;

/******************************************
*extern function declare
******************************************/
Sigfunc signal(int signo, Sigfunc sigfun);
void TELL_WAIT(void);
void TELL_PARENT(pid_t pid);
void WAIT_PARENT(void);
void TELL_CHILD(pid_t pid);
void WAIT_CHILD(void);

/*****************************************
*local function declare and implement
*****************************************/
static void sig_usr(int signo){
sigflag = 1;
}
/******************************************
*extern function implement
*****************************************/
void TELL_WAIT(void){
if( signal(SIGUSR1, sig_usr) == SIG_ERR)
;
if( signal(SIGUSR2, sig_usr) == SIG_ERR)
;
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGUSR1);
sigaddset(&newmask, SIGUSR2);
if(sigprocmask(SIG_BLOCK, &newmask, &oldmask)<0)
;
}
void TELL_PARENT(pid_t pid){
kill(pid, SIGUSR2);
}
void WAIT_PARENT(void){
while(sigflag == 0)
sigsuspend(&zeromask);
sigflag = 0;
if(sigprocmask(SIG_SETMASK, &oldmask, NULL)<0)
;
}
void TELL_CHILD(pid_t pid){
kill(pid, SIGUSR2);
}
void WAIT_CHILD(void){
while(sigflag == 0)
sigsuspend(&zeromask);
sigflag = 0;
if(sigprocmask(SIG_SETMASK, &oldmask, NULL)<0)
;
}

Sigfunc signal(int signo, Sigfunc sigfun){
struct sigaction act, oact;
act.sa_handler = sigfun;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if(signo == SIGALRM){
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT;
printf("[signal sysnc] defined SA_INTERRUPT\n");
#endif
}else{
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART;
printf("[Signal Sysnc] defined SA_RESTART\n");
#endif
}
if(sigaction(signo, &act, &oact)<0)
return SIG_ERR;
return oact.sa_handler;
}

static volatile int i = 0;
int main(void)
{
pid_t pid;
int fd;
char buf[512];
TELL_WAIT();
if((fd = open("./temp.file", O_CREAT | O_TRUNC | O_WRONLY, 0644))<0)
;
sprintf(buf, "%d", i);
write(fd, buf , strlen(buf));
if((pid = fork())<0){
fprintf(stderr, "fork error\n");
return -1;
}else if(0 == pid){
int j;
printf("enter child\n");
for(j = 0; j<100; j++){ ///死活都进不了这里////
WAIT_PARENT();
++i;
sprintf(buf, "%d", i);
write(fd, buf , strlen(buf));
printf("child:%d\n", i);
TELL_PARENT(getppid());

}
exit(0);
}else{
printf("enter parent\n");
TELL_CHILD(pid);
while(i != 100){
WAIT_CHILD();
++i;
sprintf(buf, "%d", i);
write(fd, buf , strlen(buf));
printf("parent:%d\n", i);
TELL_CHILD(pid);
}
}
return 0;
}

你原来的代码WAIT_CHILD(); 这里挂住了。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧