Tag: fork

子程序不会在C程序中死亡

我正在编写一个C程序,它将STDIN中的输入解析为单词,生成由numsorts变量指定的多个排序进程,以循环方式将单词排序到每个排序进程,并发送排序的输出到STDOUT。 如果指定的排序进程的数量为1,我的程序将按照需要工作并干净地退出,但如果排序进程的数量大于1,则排序子进程不会死,并且我的程序会等待它们。 对我来说,最奇怪的部分是,如果我打开一个单独的终端窗口并杀死除1以外的所有孩子,最后一个孩子会立即自行死亡并且程序干净利落。 这是我的解析器代码(管道文件描述符存储在一个二维数组中): void RRParser(int numsorts, int **outPipe){ //Round Robin parser int i; char word[MAX_WORD_LEN]; //Close read end of pipes for(i = 0; i < numsorts; i++){ closePipe(outPipe[i][0]); } //fdopen() all output pipes FILE *outputs[numsorts]; for(i=0; i < numsorts; i++){ outputs[i] = fdopen(outPipe[i][1], "w"); if(outputs[i] == NULL) printf("Error: could not create output stream.\n"); } […]

Select()仍然阻止从管道读取

我的应用程序分叉一个孩子,孩子执行一个新的程序,父母写入它,然后在孩子完成一些工作后从孩子读回来。 当监视管道的读取结束时,程序仍然等待孩子。 我目前没有写回父母,所以它故意阻止。 下面是代码(write_to()函数关闭函数中管道的未使用部分): pid_t leaf_proc; int rv = 0; int w_pfd[2]; int r_pfd[2]; if(pipe(w_pfd) == -1 || pipe(r_pfd) == -1){ printf(“Failed to pipe. Goodbye.\n”); exit(0); } if((leaf_proc = fork()) < 0){ printf("Error: %s\n",strerror(errno)); exit(0); }else if(leaf_proc == 0){ /***Child to be execl()'d***/ rv = execl("Some program"); if(rv < 0){ printf("Error: %s\n",strerror(errno)); exit(0); } }else{ […]

在C中使用fork()和TCP连接进行设计

关于如何设计以下系统,我有一个问题: 我的系统由几个听取环境的客户构建。 当违反音频阈值时,他们将信息发送到服务器,该服务器让孩子们监听每个连接。 服务器需要来自所有客户端的信息以进行必要的计算。 目前,服务器在UNIX中工作,并且已经分叉连接。 他们是独立工作的。 我想要做的是告诉父母(在服务器中)已经发送了信息,现在是时候处理它了。 我该怎么办 ? 我正在考虑可能的不同方法: 在Unix中使用signal()以某种方式告诉父母发生了什么 转换为线程并使用一些等待和通知function 信号是优选的,但我无法弄清楚如何有效地做到这一点。 因为我的系统中可能发生以下情况: 如果所有客户端成功地将信息发送给他们的服务器的子女,我怎样才能告诉父母我已经准备好了? 不知道/我不确定它将如何处理它们。 服务器可能无法从所有客户端接收信息。 因此,父母必须等待所有孩子一段时间,但不要太久。 所以我猜某种计时器?

使用fork()和IPC在C中进行最有效的矩阵乘法

我需要使用多个进程在C中实现并发矩阵乘法。 我理解,因为每个进程都有自己的私有地址空间,我将不得不使用某种forms的进程间通信(IPC)。 我做了一些环顾四周,找不到许多不使用线程的实现。 我想知道是否有人知道最好的方法,使用共享内存,消息传递或管道? 我不是要求解决方案,而是,如果有人知道,这些方法中的哪一种在矩阵乘法中会更有效。 或者,如果有一个通用的标准方法来执行多个流程?

使用fork和dup的简单http通用服务器

我正在尝试编写一个非常基本的HTTP服务器。 我想将服务器和服务分成两个单独的可执行文件(类似于inetd)。 所以我有一个通用服务器,它使用exec分叉服务并执行其代码。 主循环如下: while(true) { int client_sock; if ((client_sock = accept(server_sock, (struct sockaddr *) NULL, NULL)) < 0) { return -1; } pid_t pid = fork(); if (pid == 0) { close(server_sock); close(0); dup(client_sock); close(1); dup(client_sock); execvp(argv[2], argv+2); return -1; } else if (pid < 0) { assert(false); } close(client_sock); } 该服务读取stdin,并在stdout上写入并处理简单的http请求。 当我使用nc连接到我的服务器时,一切似乎都工作正常。 nc接收并显示预期的http回复。 […]

fork()kill()和execv()

我在这里尝试一个小unit testing。 但该计划并不像我预期的那样有效。 char *args[2]; args[0] = (char*)”/usr/bin/firefox”; args[1] = NULL; pid = fork(); printf(“forked and my pid is %d\n”,pid); //check for errors if (pid<0){ printf("Error: invoking fork to start ss has failed, Exiting\n "); exit(1); } //the child process runs firefox if (pid==0){ if (execv(args[0],args)0){ sleep(3); kill(get_pidof(string(“firefox”)),SIGUSR1); } 现在,我希望程序运行如下:1。孩子运行firefox(它确实如此)2。爸爸打印DAD即将杀死U(到目前为止一样好)3。firefox会打开3秒钟然后关闭(也是这样)4。子进程将完成运行execv并打印“IVE BEEN KILLED”。 这不会发生。 我的目的是要知道execv运行的程序已经通过在execv继续运行之后立即引发一些标志来完成(其中我已被杀死了printf)。 除非必要,否则我有几千行的代码并且不想使用其他方法。 […]

子进程是否可以等待它的兄弟进程,并获得其退出状态?

我正试图从一个孩子的过程中获得其“兄弟姐妹”的退出状态, 我试过这样做: int main(void){ int i,j,status,p1; pid_t pids[2],pid; for (i = 0; i < 2; i++){ pids[i]=fork(); /*child 1*/ if(pids[i]==0 && i==0)exit(5); /*child 2*/ else if(pids[i]==0 && i==1){ waitpid(pids[0],&p1,0); exit(WEXITSTATUS(p1)); } } for(j=0;j<2;j++ ){ pid = wait(&status); if(pid==pids[0]){ printf("child process 0 exit with status %d\n",WEXITSTATUS(status)); } else if(pid==pids[1]){ printf("child process 1 exit with status %d\n",WEXITSTATUS(status)); […]

如何在父母继续前等待所有孩子终止?

我正在做一些并行编程(多处理),我需要父代: 1) Fork几个孩子 2)在创建所有孩子之后,只需等待所有孩子终止 3)在所有孩子被终止后,做一些其他的工作。 这是我试过的: int main(int argc, char **argv[]) { int j, i; pid_t children[3]; int pid; // Fork the processes for(j = 0; j < 3; j++){ if((children[j] = fork()) == 0){ // Child process for(i = 0; i < 2; i++){ printf("child %d printing: %d\n", j, i); } }else { // […]

用execv调用’ls’

我是系统调用和C编程的新手,正在完成我的大学任务。 我想调用’ls’命令并让它打印目录。 我有什么:(我已经添加了评论,因此您可以看到我通过每个变量看到的内容。 int execute( command* cmd ){ char full_path[50]; find_fullP(full_path, p_cmd); //find_fullP successfully updates full_path to /bin/ls char* args[p_cmd->argc]; args[0] = p_cmd->name; int i; for(i = 1; i argc; i++){ args[i] = p_cmd->argv[i]; } /* * this piece of code updates an args variable which holds arguments * (stored in the struct) in case […]

子进程和父进程ID

刚刚与子进程块中的父pid值混淆。 我的计划如下: int main(int argc, char *argv[]) { pid_t pid; pid=fork(); if(pid==-1){ perror(“fork failure”); exit(EXIT_FAILURE); } else if(pid==0){ printf(“pid in child=%d and parent=%d\n”,getpid(),getppid()); } else{ printf(“pid in parent=%d and childid=%d\n”,getpid(),pid); } exit(EXIT_SUCCESS); } 输出:父级中的pid = 2642,子级= 2643 子元素中的pid = 2643,父元素= 1 在“高级Unix编程”中,它表示子进程可以使用getppid()函数获取父进程id。 但在这里我得到“1”,这是“init”进程ID。 如何在子进程块中获取父pid值..请帮助我获取输出。 我在“Linux Mint OS”中执行但在“WindRiver”操作系统中我没有遇到这个问题。 该程序是否根据操作系统改变行为?