C 连接并发送两个外壳
在看了下面的教程()之后,我意识到我无法让两个终端相互通信,并且在web上也找不到任何关于它的资源。更准确地说,我试图让两个终端使用相同的代码而不是相同的参数一起通信。 以下是我使用的两个函数:C 连接并发送两个外壳,c,C,在看了下面的教程()之后,我意识到我无法让两个终端相互通信,并且在web上也找不到任何关于它的资源。更准确地说,我试图让两个终端使用相同的代码而不是相同的参数一起通信。 以下是我使用的两个函数: int connect_parent(void) { write(1, "my_pid: ", 9); my_putnbr(getpid()); write(1, "\nwaiting for enemy connection...\n",
int connect_parent(void)
{
write(1, "my_pid: ", 9);
my_putnbr(getpid());
write(1, "\nwaiting for enemy connection...\n", 34);
pause();
signal(SIGINT, handle_sigint);
}
int connect_child(char * char_pid)
{
int parent_pid = my_getnbr(char_pid);
int my_pid = getpid();
int fd[2];
if (pipe(fd) == -1) {
write(2, "Pipe failed\n", 13);
return 84;
}
close(fd[0]);
write(fd[1], "test", 5);
close(fd[1]);
if (kill(parent_pid, SIGINT) != -1) {
write(1, "my_pid: ", 9);
my_putnbr(my_pid);
write(1, "\nsuccessfully connected\n", 25);
pause();
return 0;
}
write(2, "Wrong pid\n", 11);
return 84;
}
以下是我的主要功能:
int main(int argc, char ** argv)
{
if (argc == 2) {
if (my_strstr(argv[1], "-h") != 0)
help_flag();
if (error_handling(argv[1]) != 84) {
connect_parent();
return 0;
} else
return 84;
} else if (argc == 3) {
if (error_handling(argv[2]) != 84) {
connect_child(argv[1]);
return 0;
} else
return 84;
}
return 84;
}
第一个终端的父函数,第二个终端的子函数。
目标是在两个终端连接在一起时发送简单文本
此时,我的第一个终端正在使用pause()
函数等待信号,当第二个终端发送SIGINT信号时,第一个终端退出
以下是我在第一个终端上运行的命令:
./navy ./pos1
下面是我对第二个执行的命令:
./navy <pid of the first terminal> ./pos2
/navy./pos2
您是否有我可以依赖的资源或如何执行此操作的说明?两个程序都需要执行以下命令:
key_t key = ftok(<existing_file>, <random_number>); //for example: ftok("navy.c", 12);
char **text;
int memid = shmget(key, sizeof(char *), IPC_CREAT | IPC_EXCL | 0600); //if this returns -1, an error occured
*text = shmat(memid, 0, 0); //You attach the pointer to the shared memory variable position
key\u t key=ftok(,)//例如:ftok(“navy.c”,12);
字符**文本;
int memid=shmget(键,大小(字符*),IPC|u CREAT | IPC|u EXCL | 0600)//如果返回-1,则发生错误
*text=shmat(memid,0,0)//将指针附加到共享内存变量位置
然后,您可以根据需要修改文本。两个程序都将“看到”此变量
不要忘记在两次执行中shmdt(*text)
(分离指针),并清除为共享变量执行创建的内存空间:shmctl(memid,IPC\u RMID,NULL)不再需要共享变量后,只需在其中一个进程中执行代码>。两个程序都需要执行以下命令行:
key_t key = ftok(<existing_file>, <random_number>); //for example: ftok("navy.c", 12);
char **text;
int memid = shmget(key, sizeof(char *), IPC_CREAT | IPC_EXCL | 0600); //if this returns -1, an error occured
*text = shmat(memid, 0, 0); //You attach the pointer to the shared memory variable position
key\u t key=ftok(,)//例如:ftok(“navy.c”,12);
字符**文本;
int memid=shmget(键,大小(字符*),IPC|u CREAT | IPC|u EXCL | 0600)//如果返回-1,则发生错误
*text=shmat(memid,0,0)//将指针附加到共享内存变量位置
然后,您可以根据需要修改文本。两个程序都将“看到”此变量
不要忘记在两次执行中shmdt(*text)
(分离指针),并清除为共享变量执行创建的内存空间:shmctl(memid,IPC\u RMID,NULL)在您不再需要共享变量后,只需在其中一个过程中执行code>。什么是/navy
?@Barmar./navy是我的可执行文件的名称是,因此显示navy
的代码。main
看起来像什么?缺少哪些其他代码?您没有显示main()
函数,它与参数有什么关系?如何将这两个进程连接在一起?然后只需将文本存储在共享内存变量中什么是/navy
?@Barmar./navy是我的可执行文件的名称是,因此显示navy
的代码。main
看起来像什么?缺少哪些其他代码?您没有显示main()
函数,它与参数有什么关系?如何将两个进程连接在一起?然后只需将文本存储在共享内存变量ftok()
将返回系统中的可用内存地址,并将其存储在key\t
variable您忘记了IPC中的C\u EXCL,我想是的,已编辑ftok()
将返回系统中的可用内存地址,并将其存储在key\t
变量中您忘记了IPC中的C,我认为这是正确的,已编辑!