进程间通信的六种常见方式

article/2025/10/9 14:35:07

目录

进程间通信(IPC):

一、管道

二、FIFO

三、消息队列 

四、共享内存

五、信号 

六、信号量

七、进程间通信方式总结:


进程间通信(IPC):

进程间通信的方式有很多,这里主要讲到进程间通信的六种方式,分别为:管道、FIFO、消息队列、共享内存、信号、信号量。

参考文章:https://blog.csdn.net/qq_34343254/article/details/107431229

一、管道

管道的特点:

  1. 是一种半双工的通信方式;
  2. 只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系;
  3. 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

管道的原型:

 #include <unistd.h>

int pipe(int pipefd[2]); 

代码实现:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>/*使用匿名管道实现进程间通信*/
int main()
{int fd[2];//fd[0]为读端 fd[1]为写端pid_t pid;char buf[128];//int pipe(int pipefd[2]);if(pipe(fd) == -1)//创建管道{printf("管道创建失败\n");perror("why");}pid = fork();if(pid < 0 ){printf("子进程开辟失败\n");perror("why");}else if(pid > 0){sleep(3);//让子进程先执行printf("这是一个父进程\n");//父进程完成写操作close(fd[0]);write(fd[1],"hello from father",strlen("hello from father"));}else{printf("这是一个子进程\n");//子进程完成读操作close(fd[1]);read(fd[0],buf,sizeof(buf));//没有数据来时,阻塞在这printf("buf = %s\n",buf);}return 0;
}

二、FIFO

FIFO,也叫做命名管道,它是一种文件类型。

FIFO的特点:

  1. FIFO可以在无关的进程之间交换数据,与无名管道不同;
  2. FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

FIFO的原型:

#include <sys/types.h>

#include <sys/stat.h>

int mkfifo(const char *pathname, mode_t mode);

其中的 mode 参数与 open 函数中的 mode 相同。一旦创建了一个 FIFO,就可以用一般的文件 I/O 函数操作它。

当 open 一个 FIFO 时,是否设置非阻塞标志(O_NONBLOCK)的区别:

  • 若没有指定 O_NONBLOCK(默认),只读 open 要阻塞到某个其他进程为写而打开此 FIFO。类似的,只写 open 要阻塞到某个其他进程为读而打开它。
  • 若指定了 O_NONBLOCK,则只读 open 立即返回。而只写 open 将出错返回 -1 如果没有进程已经为读而打开该 FIFO,其 errno 置 ENXIO。

代码实现:

下列代码有效解决了,当管道存在时,程序报错的问题,减少了无关错误信息的打印。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
//       int mkfifo(const char *pathname, mode_t mode);int main()
{if(mkfifo("myfifo",0600) == -1 && errno != EEXIST){printf("mkfifo failed\n");perror("why");}return 0;
}

read.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>//       int mkfifo(const char *pathname, mode_t mode);int main()
{int nread;char buf[30] = {'\0'};if(mkfifo("myfifo",0600) == -1 && errno != EEXIST)//创建命名管道{printf("mkfifo failed\n");perror("why");}int fd = open("./myfifo",O_RDONLY);//以只读的形式打开管道,程序阻塞在这,直到有另一个进程对其执行写操作if(fd < 0){printf("read open failed\n");}else{printf("read open successn\n");}while(1){nread = read(fd,buf,sizeof(buf));printf("read %d byte,context is:%s\n",nread,buf);}close(fd);return 0;
}

write.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
//       int mkfifo(const char *pathname, mode_t mode);int main()
{int nread;char buf[30] = "message from myfifo";if(mkfifo("myfifo",0600) == -1 && errno != EEXIST)//创建命名管道{printf("mkfifo failed\n");perror("why");}int fd = open("./myfifo",O_WRONLY);//打开管道,程序阻塞在这,直到其他进程为读而打开它if(fd < 0){printf("write open failed\n");}else{printf("write open success\n");}while(1){sleep(1);write(fd,buf,strlen(buf));}close(fd);return 0;
}

三、消息队列 

消息队列,是消息的链接表,存放在内核之中。一个消息队列由一个标识符(即队列ID)来标识。

用户进程可以向消息队列添加消息,也可以向消息队列读取消息。

消息队列的特点:

  1. 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级;
  2. 消息队列是独立于发送和接收进程的,进程终止时,消息队列及其内容并不会被删除;
  3. 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

消息队列函数的原型:

// 创建或打开消息队列:成功返回队列ID,失败返回-1
int msgget(key_t key, int flag);
// 添加消息:成功返回0,失败返回-1
int msgsnd(int msqid, const void *ptr, size_t size, int flag);
// 读取消息:成功返回消息数据的长度,失败返回-1
int msgrcv(int msqid, void *ptr, size_t size, long type,int flag);
// 控制消息队列:成功返回0,失败返回-1
int msgctl(int msqid, int cmd, struct msqid_ds *buf);

代码演示:

msgSend.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
//       int msgget(key_t key, int msgflg);
// int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);//       ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
struct msgbuf{long mtype;       /* message type, must be > 0 */char mtext[128];    /* message data */
};int main()
{struct msgbuf sendbuf={888,"message from send"};struct msgbuf readbuf;key_t key;if((key = ftok(".",'z')) < 0){printf("ftok error\n");}int msgId = msgget(key,IPC_CREAT|0777);if(msgId == -1){printf("get quen failed\n");}msgsnd(msgId,&sendbuf,strlen(sendbuf.mtext),0);printf("send over\n");msgrcv(msgId,&readbuf,sizeof(readbuf.mtext),999,0);printf("read from get is:%s\n",readbuf.mtext);msgctl(msgId,IPC_RMID,NULL);return 0;
}

msgGet.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
//       int msgget(key_t key, int msgflg);
// int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);//       ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
struct msgbuf{long mtype;       /* message type, must be > 0 */char mtext[128];    /* message data */
};int main()
{struct msgbuf readbuf;memset(readbuf.mtext, '\0', sizeof(readbuf.mtext));struct msgbuf sendbuf={999,"thank for your reach"};key_t key;//获取key值if((key = ftok(".",'z')) < 0){printf("ftok error\n");}int msgId = msgget(key,IPC_CREAT|0777);if(msgId == -1){printf("get quen failed\n");perror("why");}msgrcv(msgId,&readbuf,sizeof(readbuf.mtext),888,0);printf("read from send is:%s\n",readbuf.mtext);msgsnd(msgId,&sendbuf,strlen(sendbuf.mtext),0);msgctl(msgId,IPC_RMID,NULL);return 0;
}

四、共享内存

共享内存,指两个或多个进程共享一个给定的存储区。

ipcs -m 查看系统下已有的共享内存;ipcrm -m shmid可以用来删除共享内存。

共享内存的特点:

  1. 共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。
  2. 因为多个进程可以同时操作,所以需要进行同步。
  3. 信号量 + 共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。

共享内存函数的原型:

// 创建或获取一个共享内存:成功返回共享内存ID,失败返回-1
int shmget(key_t key, size_t size, int flag);
// 连接共享内存到当前进程的地址空间:成功返回指向共享内存的指针,失败返回-1
void *shmat(int shm_id, const void *addr, int flag);
// 断开与共享内存的连接:成功返回0,失败返回-1
int shmdt(void *addr); 
// 控制共享内存的相关信息:成功返回0,失败返回-1
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);

代码演示:

shmw.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>//       int shmget(key_t key, size_t size, int shmflg);
// void *shmat(int shmid, const void *shmaddr, int shmflg);//       int shmdt(const void *shmaddr);int main()
{int shmId;key_t key;char *shmaddr;if((key = ftok(".",1)) < 0){printf("ftok error\n");}shmId = shmget(key, 1024*4, IPC_CREAT|0666);//内存大小必须得是MB的整数倍if(shmId == -1){printf("shmget error\n");exit(-1);}/*第二个参数一般写0,让linux内核自动分配空间,第三个参数也一般写0,表示可读可写*/shmaddr = shmat(shmId, 0, 0);printf("shmat OK\n");strcpy(shmaddr,"I am so cool");sleep(5);//等待5秒,让别的进程去读shmdt(shmaddr);shmctl(shmId, IPC_RMID, 0);//写0表示不关心printf("quit\n");return 0;
}

shmr.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>//       int shmget(key_t key, size_t size, int shmflg);
// void *shmat(int shmid, const void *shmaddr, int shmflg);//       int shmdt(const void *shmaddr);int main()
{int shmId;key_t key;char *shmaddr;if((key = ftok(".",1)) < 0){printf("ftok error\n");}shmId = shmget(key, 1024*4, 0);//内存大小必须得是MB的整数倍if(shmId == -1){printf("shmget error\n");exit(-1);}/*第二个参数一般写0,让linux内核自动分配空间,第三个参数也一般写0,表示可读可写*/shmaddr = shmat(shmId, 0, 0);printf("shmat OK\n");printf("data : %s\n",shmaddr);shmdt(shmaddr);return 0;
}

五、信号 

 对于 Linux来说,实际信号是软中断,许多重要的程序都需要处理信号。终端用户输入了 ctrl+c 来中断程序,会通过信号机制停止一个程序。

信号的相关概述:

1、信号的名字和编号:

每个信号都有一个名字和编号,这些名字都以“SIG”开头。我们可以通过kill -l来查看信号的名字以及序号。

不存在0信号,kill对于0信号有特殊的应用。

2、信号的处理:

信号的处理有三种方法,分别是:忽略、捕捉和默认动作。

  • 忽略信号,大多数信号可以使用这个方式来处理,但是有两种信号不能被忽略(分别是 SIGKILLSIGSTOP);
  • 捕捉信号,需要告诉内核,用户希望如何处理某一种信号,说白了就是写一个信号处理函数,然后将这个函数告诉内核。当该信号产生时,由内核来调用用户自定义的函数,以此来实现某种信号的处理。
  • 系统默认动作,对于每个信号来说,系统都对应由默认的处理动作,当发生了该信号,系统会自动执行。具体的信号默认动作可以使用man 7 signal来查看系统的具体定义。

信号处理函数的注册:

  1. 入门版:函数signal
  2. 高级版:函数sigaction

信号处理发送函数:

  1. 入门版:kill
  2. 高级版:sigqueue

入门版:

函数原型:

 //接收函数,第二个参数指向信号处理函数

sighandler_t signal(int signum, sighandler_t handler);

//发送函数
 int kill(pid_t pid, int sig);

接收端:

#include <stdio.h>
#include <signal.h>//       typedef void (*sighandler_t)(int);//       sighandler_t signal(int signum, sighandler_t handler);
/*接受到信号后,让信号处理该函数*/
void handler(int signum)
{printf("signum = %d\n",signum);switch(signum){case 2:printf("SIGINT\n");break;case 9:printf("SIGKILL\n");break;case 10:printf("SIGUSR1\n");break;}
}int main()
{signal(SIGINT,handler);signal(SIGKILL,handler);signal(SIGUSR1,handler);while(1);return 0;
}

发送端:

#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>//       int kill(pid_t pid, int sig);int main(int argc,char **argv)
{int signum;int pid;signum = atoi(argv[1]);//将字符型转为整型pid = atoi(argv[2]);kill(pid,signum);printf("signum = %d,pid = %d\n",signum,pid);return 0;
}

高级版:

函数原型:

#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);struct sigaction {void       (*sa_handler)(int); //信号处理程序,不接受额外数据,SIG_IGN 为忽略,SIG_DFL 为默认动作void       (*sa_sigaction)(int, siginfo_t *, void *); //信号处理程序,能够接受额外数据和sigqueue配合使用sigset_t   sa_mask;//阻塞关键字的信号集,可以再调用捕捉函数之前,把信号添加到信号阻塞字,信号捕捉函数返回之前恢复为原先的值。int        sa_flags;//影响信号的行为SA_SIGINFO表示能够接受数据};
//回调函数句柄sa_handler、sa_sigaction只能任选其一

我们只需要配置 sa_sigaction以及sa_flags即可。

siginfo_t {int      si_signo;    /* Signal number */int      si_errno;    /* An errno value */int      si_code;     /* Signal code */int      si_trapno;   /* Trap number that causedhardware-generated signal(unused on most architectures) */pid_t    si_pid;      /* Sending process ID */uid_t    si_uid;      /* Real user ID of sending process */int      si_status;   /* Exit value or signal */clock_t  si_utime;    /* User time consumed */clock_t  si_stime;    /* System time consumed */sigval_t si_value;    /* Signal value */int      si_int;      /* POSIX.1b signal */void    *si_ptr;      /* POSIX.1b signal */int      si_overrun;  /* Timer overrun count; POSIX.1b timers */int      si_timerid;  /* Timer ID; POSIX.1b timers */void    *si_addr;     /* Memory location which caused fault */int      si_band;     /* Band event */int      si_fd;       /* File descriptor */
}
#include <signal.h>
int sigqueue(pid_t pid, int sig, const union sigval value);
union sigval {int   sival_int;void *sival_ptr;};

接收端:

#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>//       int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);//(*sa_sigaction)(int, siginfo_t *, void *);
void handler(int signum, siginfo_t *info, void *context)
{printf("get signum is:%d\n",signum);if(context != NULL){printf("get data = %d\n",info->si_int);printf("get data = %d\n",info->si_value.sival_int);printf("get pid is = %d\n",info->si_pid);}}int main()
{struct sigaction act;printf("pid = %d\n",getpid());act.sa_sigaction = handler;act.sa_flags = SA_SIGINFO;sigaction(SIGUSR1,&act,NULL);while(1);return 0;
}

发送端:

#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
//       int sigqueue(pid_t pid, int sig, const union sigval value);int main(int argc,char **argv)
{int signum;int pid;signum = atoi(argv[1]);pid = atoi(argv[2]);union sigval value;value.sival_int = 100;sigqueue(pid,signum,value);printf("pid = %d,done\n",getpid());return 0;
}

注意:信号发送字符串,只有在父子进程或者是共享内存下才可发送。 

六、信号量

信号量与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

信号量的特点:

  1. 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
  2. 信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
  3. 每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
  4. 支持信号量组

信号量的函数原型:

// 创建或获取一个信号量组:若成功返回信号量集ID,失败返回-1
int semget(key_t key, int num_sems, int sem_flags);
// 对信号量组进行操作,改变信号量的值:成功返回0,失败返回-1
int semop(int semid, struct sembuf semoparray[], size_t numops);  
// 控制信号量的相关信息
int semctl(int semid, int sem_num, int cmd, ...);

当 semget 创建新的信号量集合时,必须指定集合中信号量的个数(即 num_sems),通常为 1; 如果是引用一个现有的集合,则将 num_sems 指定为 0 。

在 semop 函数中,sembuf 结构的定义如下:


struct sembuf 
{short sem_num; // 信号量组中对应的序号,0~sem_nums-1short sem_op;  // 信号量值在一次操作中的改变量short sem_flg; // IPC_NOWAIT, SEM_UNDO
}

在 semctl 函数中的命令有多种,这里就说两个常用的:

  • SETVAL:用于初始化信号量为一个已知的值。
  • IPC_RMID:删除一个信号量集合。如果不删除信号量,它将继续在系统中存在,即使程序已经退出,它可能在你下次运行此程序时引发问题,而且信号量是一种有限的资源。

代码演示:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>//       int semget(key_t key, int nsems, int semflg);
//       int semctl(int semid, int semnum, int cmd, ...);
//       int semop(int semid, struct sembuf *sops, size_t nsops);
union semun{int              val;    /* Value for SETVAL */struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */unsigned short  *array;  /* Array for GETALL, SETALL */struct seminfo  *__buf;  /* Buffer for IPC_INFO(Linux-specific) */
};//P操作,拿钥匙
void PGetKey(int semid)
{struct sembuf sops;sops.sem_num = 0;sops.sem_op = -1;sops.sem_flg = SEM_UNDO;semop(semid, &sops, 1);
}//V操作,放回钥匙
void VPutBackKey(int semid)
{struct sembuf sops;sops.sem_num = 0;sops.sem_op = 1;sops.sem_flg = SEM_UNDO;semop(semid, &sops, 1);
}int main()
{key_t key;int semid;if((key == ftok(".",6)) < 0){printf("ftok error\n");}semid = semget(key , 1,  IPC_CREAT|0666);//创造钥匙,数量为1union semun sem;sem.val = 0;//初始状态为没有钥匙semctl(semid, 0, SETVAL, sem);//SETVAL初始化信号量为一个已知的值,这时就需要第四个参数//0表示操作第一把钥匙int pid = fork();if(pid < 0){printf("fork failed\n");}else if(pid == 0){printf("this is child\n");VPutBackKey(semid);//首先把钥匙放回     }else{PGetKey(semid);//等子进程将钥匙放回后才会进行操作,保证子进程先执行printf("this is father\n");VPutBackKey(semid);semctl(semid, 0, IPC_RMID);//销毁钥匙}return 0;
}

七、进程间通信方式总结:

  1. 管道:速度慢,容量有限,只有父子进程能通讯;
  2. FIFO:任何进程间都能通讯,但速度慢;
  3. 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题;
  4. 共享内存:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题;
  5. 信号:有入门版和高级版两种,区别在于入门版注重动作,高级版可以传递消息。只有在父子进程或者是共享内存中,才可以发送字符串消息;
  6. 信号量:不能传递复杂消息,只能用来同步。用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

 


http://chatgpt.dhexx.cn/article/2JuKXSpl.shtml

相关文章

idea数据库管理工具配置连接数据库

idea数据库管理工具配置连接数据库 —————————————————————————————————————————————————————— 在cmd中操作数据库太麻烦了&#xff0c;还好idea为我们提供了很方便的数据库管理工具&#xff0c;下面看看如何用idea连接…

idea连接数据库失败解决办法

一.IDEA连接Mysql报错&#xff1a; 未找到驱动程序类 ‘com.mysql.cj.jdbc.Driver‘.  Change driver class 报错详细内容&#xff1a;未找到驱动程序类 ‘com.mysql.cj.jdbc.Driver’. Change driver class 报错原因&#xff1a;Mysql版本为5.0&#xff0c;找不到com.mysql.…

IDEA中如何连接数据库并显示数据库信息。

我的相关博客&#xff1a; java代码程序中连接mysql数据库的方法及代码 mysql数据库并发上锁问题&#xff0c;java代码 关于IDEA中怎么连接mysql数据库 相信部分朋友在使用IDEA操作数据库的时候会出现有关数据库信息的报错。 显示没有此表&#xff0c;或者无数据库等错误信息…

idea连接数据库失败原因及解决方案

这是因为安装mysql的时候时区设置的不正确 mysql默认的是美国的时区&#xff0c;而我们中国大陆要比他们迟8小时&#xff0c;采用8:00格式。使用的数据库是MySQL&#xff0c;在你没有指定MySQL驱动版本的情况下它自动依赖的驱动是8.0.12很高的版本&#xff0c;这是由于数据库和…

IDEA如何连接数据库 / IDEA连接数据库 新手,图解

如果在下面操作中遇到了问题&#xff0c;可以查看我的这篇笔记 https://blog.csdn.net/qq_44627608/article/details/115442815 1. 打开IDEA的数据库设置 2. 新建数据库链接 左上角的便是你链接的数据库了&#xff0c;第一次打开时左上角应该是空的&#xff0c;需要你从下面的…

IDEA使用Database连接数据库

一&#xff0c;连接数据库 1.点击右侧Database后,点击左上角按钮&#xff0c;然后选中Data Source &#xff0c;无论使用的是MariaDB还是MySQL都选中MySQL 2.点击非常隐蔽的 … 按钮 3.选中你需要使用的数据库 4.填写数据的账号&#xff0c;密码&#xff0c;数据库名称&…

idea代码连接mysql数据库操作

此文章仅为作者学习上的问题记录&#xff0c;如有错误&#xff0c;欢迎指正。 首先是准备工作 先创建一个Module 之后在此Module下创建一个lib包 然后将下载的连接包复制到lib包下&#xff0c;连接包下载地址&#xff1a; https://cdn.mysql.com//Downloads/Connector-J/mysq…

IDEA中配置数据库连接

1.点击IDEA右边框的 Database &#xff0c;在展开的界面点击 选择 Data Source &#xff0c;再选择 MySQL 2.在弹出的界面进行基本信息的填写 3.填写完后&#xff0c;点击Test Connection 测试一下 这样就是填写的没问题&#xff0c;如果是第一次点击这个&#xff0c;需要下载…

Idea连接MySQL数据库教程 (简单明了)

使用Idea连接数据库 具体步骤&#xff1a;点击右侧DataBase → 点击号 → 点击Data Source 选择MySQL → 输入用户名、密码、连接的数据库名称&#xff08;连接路径会自动生成&#xff09; → 可点击下面的Test Connection来测试连接 注意事项一&#xff1a; 第一次连接需要下…

IntelliJ IDEA配置连接MySQL数据库

如图&#xff1a; 1、点击主界面右侧边栏Database 2、点击""号 3、点击Data Source 4、点击MySQL 如图填写数据库名&#xff0c;用户名和密码&#xff0c;之后点击下方Test Connection测试 连接成功会显示上图字样 这时发现已经可以查看到数据库信息&#xff0c;说…

IDEA连接mysql数据库

1.保证mysql数据库和IDEA安装成功后&#xff0c;找到IDEA中mysql数据库的连接方式 按照图上的顺序 2.配置连接 在第一次使用的时候&#xff0c;除了要配置连接&#xff0c;还有配置相应的驱动&#xff0c;否则连接的时候会报错。 图中的①②③④⑤分别表示为&#xff1a; ①…

如何使用IDEA连接数据库?

一定要下载IDEA专业版 之前我一直用的是社区版&#xff0c;有诸多内容限制&#xff0c;且无直连数据库功能 通过学生认证&#xff08;我是认证失败直接找某宝了&#xff09;直接可以获得1年的免费试用时长 具体操作 然后输入用户、密码、数据库 这里值得一说的是&#xff0c…

Idea连接数据库并执行SQL语句

1、Idea显示Database 2、连接数据库 1、打开界面 2、配置连接信息 3、测试连接 4、面板基本信息 5、选择要显示的数据库 6、表的基本信息 7、新建查询 8、设置sql的备注名称 9、编写sql执行 10、执行结果 3、连接可能出现的问题 1、Idea显示Database idea显示Data…

IDEA连接MySQL数据库的四种方法

首先右击此电脑点击管理&#xff0c;进入页面 再服务栏确保MySQL是正常运行状态 打开IDEA, 左边栏选择Maven Archetype,新建一个名为javaweb的新工程 进行如图编辑完成新建 在Main包下新建一个java包&#xff0c;右击java包进行下图操作&#xff0c;java包拥有新建class的权限…

Idea 连接 MySQL 数据库

文章目录 前言配置 MySQL安装添加环境变量检查配置 MysQL服务状态开启关闭 在idea Ultimate中建立连接引入 Drivers 驱动添加表创建 schema 架构创建 Table 表 写入数据信息 测试类 前言 开始链接前&#xff0c;请确保本机上安装的 idea 是 Ultimate 专业版&#xff0c;点我下…

IDEA连接数据库,以及报错问题

IDEA是一款功能强大的开发工具&#xff0c;而IDEA连接数据库是其中的一个附带功能&#xff0c;该功能可以在我们开发大型任务&#xff0c;编写SQL语句时&#xff0c;提供帮助&#xff0c;例如以MySQL为例 解决SQL映射文件的警告提示&#xff1a; 在映射配置文件中存在报红的情…

IntelliJ IDEA 连接数据库 详细过程

IntelliJ IDEA集成了众多插件&#xff0c;方便开发者使用&#xff0c;使用其自带的Database模块就可以很方便的配置、连接到数据库&#xff0c;本次操作以MySQL为例&#xff0c;其中testjdbc数据库已经提前建好&#xff0c;里面有两张表emp_table 和 t_user&#xff0c;相关信息…

IntelliJ IDEA连接Mysql数据库

IntelliJ IDEA连接Mysql数据库 1、首先找到右边的Database的显示框、没有的话在工具栏中View&#xff0c;现在Tool Windows下拉菜单&#xff0c;继续选择Database&#xff0c;就可以出现。 2、然后点击有上角处的那个的“”&#xff0c;选择Data Source 下的MySQL(数据库类型取…

如何在IDEA中连接mysql数据库

补充说明下&#xff0c;本篇博文连接数据库&#xff0c;只是将IDEA作为一个Mysql数据库的可视化界面&#xff0c;无法在代码中访问。如果你们是想在代码中连接MySQL数据库&#xff0c;比如通过访问数据库的用户名和密码来进行登录验证&#xff0c;那么请看以下这篇文章《Java连…

idea:使用idea连接mysql数据库

一、首先确保数据库服务是打开的 命令行窗口和任务管理器均可查看 命令行窗口查看 在命令行窗口输入mysql&#xff08;有密码的需要输入密码&#xff0c;我的密码为空&#xff0c;所以不用输入&#xff09; 在任务管理器查看 打开任务管理器&#xff0c;查看服务选项&#xf…