Articles of 叉

在使用分叉时如何映射内存?

我是新来的“fork()”,我到处读到,当一个fork()被调用当前(调用)进程的确切副本开始。现在,当我运行下面的代码,应该有两个不同的进程,分配给他们的variables和函数的内存位置。 #include<stdio.h> int i=10; int pid; int main(){ if((pid=fork())==0){ i++;//somewhere I read that separate memory space for child is created when write is needed printf("parent address= %p\n",&i);// this should return the address from parent's memory space }else{ i++; i++; printf("child address= %p\n",&i);// this should return the address of child's memory space } wait(0); return(0); } […]

正确的fork()和pipe()用于具有多个子项的单个父项。 我该如何解决这个问题?

所以,我以前的post被标记为脱离主题,太模糊,并要求有用的代码的意见和build议。 它做了这些事情,所以我重新张贴作为我正在工作的代码的问题。 感谢上一篇文章中的内容,通过回顾你们所说的话,我能够把我在这里所得到的结果分解开来。 这里的重点是父/子关系和使用fork()和pipe()来获得所需的影响。 该项目是一个POSIX纸牌游戏,父母(经销商)从父母手中分出5个孩子(玩家)和自己的pipe道。 父母向玩家发牌(至less5卡),直到一个玩家拥有3个(不丢弃)。 获胜的孩子将获胜的手和EOF(退出(0))传送给父母以宣告胜利。 这会触发父母打印胜出的玩家,并将EOF传送给其余的孩子将其closures(退出(1))。 父母然后closures。 如果父母没有获胜者到达甲板的末端,则将EOF传递给孩子,等待他们退出(1)…然后closures。 我所面临的主要问题是孩子的程序如何分别读取每张卡片,而不是一遍又一遍地从pipe道读取相同的值。 我想我缺less一种方法来同步父母写入pipe道和孩子从pipe道读取。 我对这个家伙是全新的,所以任何帮助都非常感激。 非常感谢。 代码更新:(编译很多问题)完成和编译,但我显然有pipe道和通过它们传递数据的麻烦。 没有玩游戏,没有读取或写入pipe道,离开僵尸进程,这里是错误的。 我很感激任何投入在我的混乱。 大声笑 这是我运行程序(play.c)时的输出: os@debian:~/Documents/cpsc351/projects/assn2$ gcc -o play play.c os@debian:~/Documents/cpsc351/projects/assn2$ ./play Pipe Success…toChild 1 created. Pipe Success…toParent 1 created. Pipe Success…toChild 2 created. Pipe Success…toParent 2 created. Pipe Success…toChild 3 created. Pipe Success…toParent 3 created. Pipe Success…toChild 4 created. Pipe […]

如果一个孩子的过程在阅读的时候不会从写作中结束,会发生什么?

给出以下代码: int main(int argc, char *argv[]) { int pipefd[2]; pid_t cpid; char buf; if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } cpid = fork(); if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); } if (cpid == 0) { /* Child reads from pipe */ […]

在C客户端服务器应用程序中,socket()返回0

我正在处理一个包含多个服务器套接字的应用程序,每个服务器套接字在一个独特的线程中运行 一个外部实用程序(脚本)由其中一个线程调用。 该脚本调用将消息发送到其中一个服务器套接字的实用程序(客户端)。 最初,我使用system()来执行这个外部脚本,但是我们不能使用它,因为我们必须确保服务器套接字在被分叉执行外部脚本的孩子中被closures。 我现在自己调用fork()和execvp() 。 我fork() ,然后在孩子我closures所有的服务器套接字,然后调用execvp()来执行脚本。 现在,所有这些工作正常。 问题是有时脚本会向服务器应用程序报告错误。 脚本通过调用另一个打开TCP套接字的应用程序(客户端)发送这些错误并发送相应的数据。 我的问题是客户端应用程序获取由socket()系统调用返回的值为0 。 注意:只有当使用我的forkExec()函数调用脚本/客户端应用程序时才会发生这种情况。 如果脚本/客户端应用程序被手动调用,那么socket()调用就会正常执行,而且事情工作正常。 基于这些信息,我怀疑这是在我的fork()execvp()代码下面的东西…任何想法? void forkExec() { int stat; stat = fork(); if (stat < 0) { printf("Error forking child: %s", strerror(errno)); } else if (stat == 0) { char *progArgs[3]; /* * First, close the file descriptors that the child * shouldn't […]

用SIGTERM调用subprocess终止父进程,但用SIGKILL调用subprocess使父进程保持活动状态

这是如何防止subprocess中的SIGINT传播并杀死父进程的延续? 在上面的问题中,我了解到SIGINT并不是从孩子到家长冒泡,而是发给整个前台进程组,意味着我需要编写一个信号处理程序来防止父母在我按CTRL + C时退出CTRL + C 我试图实现这一点,但这是问题。 关于具体的kill系统调用,我调用终止子,如果我通过SIGKILL ,一切都按预期工作,但如果我通过SIGTERM ,它也终止父进程,稍后在shell提示符显示Terminated: 15 。 尽pipeSIGKILL有效,但我想使用SIGTERM是因为它看起来就像是一个更好的主意,从我读到的信息中可以看出,这个过程显示出终止一个清理自己的机会。 下面的代码是我想到的一个简单的例子 #include <stdio.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> pid_t CHILD = 0; void handle_sigint(int s) { (void)s; if (CHILD != 0) { kill(CHILD, SIGTERM); // <– SIGKILL works, but SIGTERM kills parent CHILD = 0; } } int main() { // […]

什么时候clone()和fork比pthread更好?

我是这方面的初学者。 我已经学习了fork() , vfork() , clone()和pthreads。 我已经注意到, pthread_create()将创build一个线程,这比用fork()创build一个新的进程fork()less。 此外,线程将与父进程共享文件描述符,内存等。 但是什么时候fork()和clone()比pthread更好呢? 你可以给我解释给我的真实世界的例子吗? 提前致谢。

具体来说,fork()如何在Linux中处理从malloc()dynamic分配的内存?

我有一个父母和孩子的程序。 在fork()之前,父进程调用malloc()并用一些数据填充数组。 在fork()之后,孩子需要这些数据。 我知道我可以使用pipe道,但下面的代码似乎工作: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main( int argc, char *argv[] ) { char *array; array = malloc( 20 ); strcpy( array, "Hello" ); switch( fork() ) { case 0: printf( "Child array: %s\n", array ); strcpy( array, "Goodbye" ); printf( "Child array: %s\n", array ); free( array […]

C,如何在分叉进程上使用POSIX信号量?

我想叉多个进程,然后使用它们的信号量。 这是我试过的: sem_init(&sem, 1, 1); /* semaphore*, pshared, value */ . . . if(pid != 0){ /* parent process */ wait(NULL); /* wait all child processes */ printf("\nParent: All children have exited.\n"); . . /* cleanup semaphores */ sem_destroy(&sem); exit(0); } else{ /* child process */ sem_wait(&sem); /* P operation */ printf(" Child(%d) is in […]

对于ruby / webrick,我需要窗口来识别shebang(#!)符号

(忍受我,我保证这将得到shebang和窗口。) 我有关于最简单的WEBRick服务器放在一起: require 'webrick' include WEBrick s = HTTPServer.new(:Port=>2000, :DocumentRoot=>Dir::pwd) s.start 不能更简单。 这个基本的服务器确实接受http连接(firefox,internet exploder,wget,TELENT),并且适当地处理它们,只要我只是获取静态文档。 但是,如果我将目录中的一个文件设置为具有.cgi扩展名,那么在服务器的terminal上会得到一个500以及以下内容: ERROR CGIHandler: c:/rubyCGI/test.cgi: C:/…[snip]…webrick/httpservlet/cgi_runner.rb:45: in 'exec': Exec format error – …[snip]… 我在命令行上做了一些事情来模仿cgi_runner.rb的第45行 c:\>ruby exec "c:/rubyCGI/test.cgi" ^Z (same error erupts) c:\>ruby exec "ruby c:/rubyCGI/test.cgi" ^Z Content-type: text/html Mares eat oats and does eat oats and I'll be home for Christmas. 显然,WEBrick还没有被清除,以便登陆窗口。 […]

如何在Linux中使用共享内存

我的一个项目有点问题。 我一直在试图find一个使用fork()共享内存但是没有成功的例子。 基本上情况是,当用户启动程序时,我需要在共享内存中存储两个值: current_path是char * , file_name也是char * 。 根据命令参数的不同,使用fork()启动新进程,并且该进程需要读取和修改存储在共享内存中的current_pathvariables,而file_namevariables是只读的。 有没有一个很好的教程共享内存与示例代码(如果可能),你可以指示我? 谢谢,bleepzter