Unix通信

Unix的通信方式包括: socket(套接字),pipe(管道), 消息队列, 共享内存, 信号。

  • 信号:
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <signal.h>
    
    void fc()
    {
    	printf("ctrl+c is blocked\n");
    	(void)signal(SIGINT, SIG_DFL);
    }
    
    int main(){
    	int i;
    	sigset_t set, pendset;
    	struct sigaction action;
    	(void) signal(SIGINT, fc);
    	if(sigemptyset(&set) < 0)
    		perror("init error\n");
    	if( sigprocmask(SIG_BLOCK, &set, NULL) < 0)
    		perror("block a new signal error\n");
    	else{
    		for(i=0;i<5;++i)
    		{
    			printf("showing this text is because this process is blocked\n");
    			sleep(1);
    		}
    	}
    
    	if(sigprocmask(SIG_UNBLOCK, &set, NULL) < 0)
    		perror("del a blocked signal error\n");
    }
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <signal.h>
    
    void fc()
    {
    	printf("you pressed ctrl + c \n");
    	printf("default detach.\n");
    
    	(void) signal(SIGINT, SIG_DFL);
    }
    
    int main(){
    	(void) signal(SIGINT, fc);
    	printf("main: process enter a loop.\n");
    	while(1){
    		sleep(1);
    		printf("looping\n");
    	}
    	exit(0);
    }
    
    


  • socket:server.c代码

/* File Name: server.c */  
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<errno.h>  
#include<sys/types.h>  
#include<sys/socket.h>  
#include<netinet/in.h>  
#define DEFAULT_PORT 8000  
#define MAXLINE 4096  
int main(int argc, char** argv)  
{  
    int    socket_fd, connect_fd;  
    struct sockaddr_in     servaddr;  
    char    buff[4096];  
    int     n;  
    //初始化Socket  
    if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){  
    printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);  
    exit(0);  
    }  
    //初始化  
    memset(&servaddr, 0, sizeof(servaddr));  
    servaddr.sin_family = AF_INET;  
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。  
    servaddr.sin_port = htons(DEFAULT_PORT);//设置的端口为DEFAULT_PORT  
  
    //将本地地址绑定到所创建的套接字上  
    if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){  
    printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);  
    exit(0);  
    }  
    //开始监听是否有客户端连接  
    if( listen(socket_fd, 10) == -1){  
    printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);  
    exit(0);  
    }  
    printf("======waiting for client's request======\n");  
    while(1){  
//阻塞直到有客户端连接,不然多浪费CPU资源。  
        if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -1){  
        printf("accept socket error: %s(errno: %d)",strerror(errno),errno);  
        continue;  
    }  
//接受客户端传过来的数据  
    n = recv(connect_fd, buff, MAXLINE, 0);  
//向客户端发送回应数据  
    if(!fork()){ /*紫禁城*/  
        if(send(connect_fd, "Hello,you are connected!\n", 26,0) == -1)  
        perror("send error");  
        close(connect_fd);  
        exit(0);  
    }  
    buff[n] = '\0';  
    printf("recv msg from client: %s\n", buff);  
    close(connect_fd);  
    }  
    close(socket_fd);  
}  

client.c

/* File Name: client.c */  
  
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<errno.h>  
#include<sys/types.h>  
#include<sys/socket.h>  
#include<netinet/in.h>  
  
#define MAXLINE 4096  
  
  
int main(int argc, char** argv)  
{  
    int    sockfd, n,rec_len;  
    char    recvline[4096], sendline[4096];  
    char    buf[MAXLINE];  
    struct sockaddr_in    servaddr;  
  
  
    if( argc != 2){  
    printf("usage: ./client <ipaddress>\n");  
    exit(0);  
    }  
  
  
    if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){  
    printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);  
    exit(0);  
    }  
  
  
    memset(&servaddr, 0, sizeof(servaddr));  
    servaddr.sin_family = AF_INET;  
    servaddr.sin_port = htons(8000);  
    if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){  
    printf("inet_pton error for %s\n",argv[1]);  
    exit(0);  
    }  
  
  
    if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){  
    printf("connect error: %s(errno: %d)\n",strerror(errno),errno);  
    exit(0);  
    }  
  
  
    printf("send msg to server: \n");  
    fgets(sendline, 4096, stdin);  
    if( send(sockfd, sendline, strlen(sendline), 0) < 0)  
    {  
    printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);  
    exit(0);  
    }  
    if((rec_len = recv(sockfd, buf, MAXLINE,0)) == -1) {  
       perror("recv error");  
       exit(1);  
    }  
    buf[rec_len]  = '\0';  
    printf("Received : %s ",buf);  
    close(sockfd);  
    exit(0);  
}  
  • pipe:无名pipe
    #include <string.h>
    #include<unistd.h>
    #include<wait.h>
    #include<stdlib.h>
    #include<stdio.h>
    int main()
    {
    	char buff[100];
    	memset(buff, 0, sizeof(buff));
    	int pipeFd[2];
    	if(pipe(pipeFd) < 0)
    	{
    		printf("create pipe error\n");
    		return -1;
    	}
    	pid_t forkResult;
    	if((forkResult =fork()) < 0)
    	{
    		printf("create child process error\n");
    		exit(0);
    	}
    	else if(forkResult ==0)
    	{
    		close(pipeFd[1]);
    		int readc;
    		scanf("%s",buff);
    		if((readc=read(pipeFd[0], buff, 100)) > 0)
    			printf("child proc read %s from piipe\n", buff);
    		close(pipeFd[0]);
    		exit(0);
    	}
    	else{
    		close(pipeFd[0]);
    		printf("input something:\n");
    		char buffW[100];
    		if(write(pipeFd[1], buffW, strlen(buffW)) != -1)
    			printf("child proc write %s to pipe\n", buffW);
    		close(pipeFd[1]);
    		waitpid(forkResult, NULL, 0);
    		exit(0);
    	}
    }

有名pipe

#include <stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<sys/select.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>

int main()
{
	int i,rfd,wfd,len=0,fd_in;

	struct timeval net_timer;
	mkfifo("fifol", S_IWUSR|S_IIRUSR|S_IRGRP|S_IROTH);
	mkfifo("fifor", S_IWUSR|S_IIRUSR|S_IRGRP|S_IROTH);
	fd_set wfd, rfd;
	wfd=open("fifol", O_WRONLY);
	rfd=open("fifor",O_RDONLY);
	if(rfd <= 0 || wfd <= 0) return 0;
	printf("this is a's side\n");
	char str[32];
	fd_set  write_fd, read_fd;
	while(1)
	{
		FD_ZERO(&read_fd);
		FD_SET(rfd, &read_fd);
		FD_SET(fileno(stdin), &read_fd);
		net_timer.tv_sec = 5;
		net_timer.tv.usec = 0;
		memset(str, 0, sizeof(str));
		if(i=select(rfd+1, &read_fd, NULL,  &net_timer) <= 0)
			continue;
		if(FD_ISSET(rfd, &read_fd)){
			read(read_fd, str, sizeof(str));
			printf("--------------------------------\n");
			printf("b:%s\n",str);
		}
		if(FD_ISSET(fileno(stdin), &read_fd)){
			printf("------------------------00\n");
			fgets(str, sizeof(str), sstdin);
			len = write(wfd, str, strlen(str));
			}
	}
	close(rfd);
	close(wfd);
}

popen

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main(){
	char buf[5000];
	memset(buf, 0, sizeof(buf));
	FILE *fp;
	fp = popen("ls -l", "r");
	int num;
	if(fp != NULL){
		num =fread(buf, sizeof(char), 5000, fp);
		if(num > 0){
			printf("tocken: \"ls -l\", result: \n");
			printf("%s \n", buf);
		}
		pclose(fp);
	}
	else{
		printf("popen error\n");
		return 1;
	}
	fp = popen("grep 1-9.c", "w");
	printf("second tocken is \"grep 7-8.c\" result is: \n");
	fprintf(fp, "%s\n", buf);
	pclose(fp);
	return 0;
}




猜你喜欢

转载自blog.csdn.net/httpdrestart/article/details/80637934