send_signal (int pid)

#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <string.h>
#include <pwd.h>
#include <sys/types.h>
#include <sys/stat.h>
/* Linux 的默任个人的邮箱地址是 /var/spool/mail/ */
//#define MAIL_DIR "/var/spool/mail/"
/* 睡眠10 秒钟 */
#define SLEEP_TIME 5
#define MAX_FILENAME 255
unsigned char notifyflag=1;

long get_file_size(const char *filename)
{
struct stat buf;
if(stat(filename,&buf)==-1)
{
	if(errno==ENOENT)return 0;
	else return -1;
}
return (long)buf.st_size;
}

void send_mail_notify(long n)
{
//fprintf(stderr,"New mail has arrived\007\n");
printf("New mail has arrived:%ld\007\n",n);
}

void turn_on_notify(int signo)
{
notifyflag=1;
}

void turn_off_notify(int signo)
{
notifyflag=0;
}

int check_mail(const char *filename)
{
long old_mail_size,new_mail_size;
sigset_t blockset,emptyset;
sigemptyset(&blockset);
sigemptyset(&emptyset);
sigaddset(&blockset,SIGUSR1);
sigaddset(&blockset,SIGUSR2);
old_mail_size=0;//get_file_size(filename);
if(old_mail_size<0)return 1;
if(old_mail_size>0) send_mail_notify(1);
sleep(SLEEP_TIME);
while(1)
{
	if(sigprocmask(SIG_BLOCK,&blockset,NULL)<0)
	return 1;
	while(notifyflag==0)
		sigsuspend(&emptyset);
	if(sigprocmask(SIG_SETMASK,&emptyset,NULL)<0)
		return 1;
	new_mail_size=old_mail_size+1;//get_file_size(filename);
	if(new_mail_size>old_mail_size)
		send_mail_notify(new_mail_size);
	old_mail_size=new_mail_size;
	sleep(SLEEP_TIME);
}
}

int main(void)
{
char mailfile[MAX_FILENAME];
struct sigaction newact;
struct passwd *pw;
if((pw=getpwuid(getuid()))==NULL)
{
	fprintf(stderr,"Get Login Name Error:%s\n\a",strerror(errno));
	exit(1);
}
//strcpy(mailfile,MAIL_DIR);
//strcat(mailfile,pw->pw_name);
newact.sa_handler=turn_on_notify;
newact.sa_flags=0;
sigemptyset(&newact.sa_mask);
sigaddset(&newact.sa_mask,SIGUSR1);
sigaddset(&newact.sa_mask,SIGUSR2);
if(sigaction(SIGUSR1,&newact,NULL)<0)
	fprintf(stderr,"Turn On Error:%s\n\a",strerror(errno));
newact.sa_handler=turn_off_notify;
if(sigaction(SIGUSR2,&newact,NULL)<0)
	fprintf(stderr,"Turn Off Error:%s\n\a",strerror(errno));
check_mail(mailfile);
exit(0);
}
/*
如果想程序提供提示可以发送SIGUSR1 信
号.
如果用户不想程序提示有新
的邮件到来,可以向程序发送SIGUSR2 信号,
*/
///

#include <stdio.h>
#include <signal.h>
#include <math.h>
#include <stdlib.h>

int send_signal (int pid)

{

   int ret;
   ret = kill(pid, SIGUSR1);
   //printf("ret:%d",ret);
   return ret;

}

int main(int argc, char *argv[])
{
int pid=0;
if(argc!=2)
{
	fprintf(stderr,"Usage:%s pid\n\a",argv[0]);
	exit(1);
}
sscanf(argv[1],"%d",&pid);
printf("send_signal (%d),ret:%d\n",pid,send_signal (pid));
	
	return 0;
}
//

#include <stdio.h>
#include <signal.h>
#include <math.h>
#include <stdlib.h>

int send_signal (int pid)

{

   int ret;
   ret = kill(pid, SIGUSR2);
   //printf("ret:%d",ret);
   return ret;

}

int main(int argc, char *argv[])
{
int pid=0;
if(argc!=2)
{
	fprintf(stderr,"Usage:%s pid\n\a",argv[0]);
	exit(1);
}
sscanf(argv[1],"%d",&pid);
printf("send_signal (%d),ret:%d\n",pid,send_signal (pid));
	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
按每一行解释如下代码:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/ipc.h> #include <sys/sem.h> #include <time.h> #define MSG_SIZE 100 struct sembuf sem_wait = {0, -1, SEM_UNDO}; struct sembuf sem_signal = {0, 1, SEM_UNDO}; int pfd[2]; int semid; void send_msg(int id) { srand(time(NULL) + id); int len = rand() % MSG_SIZE + 1; char msg[len]; for (int i = 0; i < len; i++) { msg[i] = 'A' + rand() % 26; } msg[len - 1] = '\0'; printf("Child %d sends message: %s\n", id, msg); semop(semid, &sem_wait, 1); write(pfd[1], msg, strlen(msg) + 1); semop(semid, &sem_signal, 1); } int main() { if (pipe(pfd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } semid = semget(IPC_PRIVATE, 1, IPC_CREAT | 0666); if (semid == -1) { perror("semget"); exit(EXIT_FAILURE); } if (semctl(semid, 0, SETVAL, 1) == -1) { perror("semctl"); exit(EXIT_FAILURE); } for (int i = 0; i < 3; i++) { pid_t pid = fork(); if (pid == -1) { perror("fork"); exit(EXIT_FAILURE); } else if (pid == 0) { send_msg(i); exit(EXIT_SUCCESS); } } for (int i = 0; i < 3; i++) { wait(NULL); } char msg[MSG_SIZE]; int total_bytes = 0; while (total_bytes < MSG_SIZE * 3) { semop(semid, &sem_wait, 1); int n_bytes = read(pfd[0], msg + total_bytes, MSG_SIZE * 3 - total_bytes); if (n_bytes == -1) { perror("read"); exit(EXIT_FAILURE); } total_bytes += n_bytes; semop(semid, &sem_signal, 1); } printf("Parent receives message: %s\n", msg); close(pfd[0]); close(pfd[1]); if (semctl(semid, 0, IPC_RMID) == -1) { perror("semctl"); exit(EXIT_FAILURE); } return 0; }
最新发布
05-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值