Tag: fork

procs,fork()和mutexes

我想创建并行运行的n个进程,让它们锁定互斥锁,递增计数器,然后解锁并退出。 这是我的代码: #include #include #include #include #include #include #include pthread_mutex_t mutex; int main(int argc, char **argv) { if (argc != 2) return 0; int n = atoi(argv[1]); int i = 0; int status = 0; pthread_mutex_init(&mutex, NULL); pid_t pid = 1; static int *x; x = mmap(NULL, sizeof *x, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, […]

作为进程子进程,如何知道哪个文件描述符是父进程

我正在尝试编写一个程序,该程序分叉并等待他的孩子完成,然后孩子在输入上做一些工作然后以与父母一样的方式分叉等等。 现在,我知道分支复制到子文件描述符数组,我应该关闭与父文件关联的那些,但我无法弄清楚哪些是父文件。 我需要给孩子这是父母的pid吗? 我一直试图在一小时的大部分时间里绕过它,我想我有一种心灵障碍,因为我无法得出结论。 TL; DR:作为子进程,我如何知道哪些文件描述符属于我的父进程?

在C中重定向到输入/输出的语法(UNIX)

我试图找到一种语法,让我在使用mkfifo()函数并使用fork创建子进程后,将标准输入输出重定向到命名管道。 我应该在哪个手册页面查看语法? 谢谢,亚伦

使用fork()的子进程和父进程

我遇到了问题,我需要制作一个程序来制作9个子进程,之后我必须进行3秒的倒计时并使这9个进程等待来自父亲的信号,在他们收到这个信号后,每个孩子们应该说他是什么孩子(如果他是孩子#1,#2,#3等……,按照他们的顺序)。 我所做的就是在这里,一切都很好,我想,直到我作为一个孩子说的部分,我的号码是什么,我不知道怎么做,因为每个孩子都是不同的进程,他们不共享内存,信号不能使用参数,现在我在名为“处理程序”的函数上打印PID,但是如何打印我的号码,作为一个孩子? #include #include #include #include #include #include void handler(int x); int main() { pid_t child[9]; pid_t child_pid; for (int i = 0; i < 9; ++i) { child_pid = fork(); child[i] = child_pid; if (child_pid == 0) break; if (child_pid < 0) { perror("fork()"); exit(EXIT_FAILURE); } } if (child_pid == 0) { signal(SIGUSR1, handler); […]

用fork()的子和父pid;

我正在尝试制作一个程序,使9个子进程,所以我只使用fork 9次,如果我们是父亲,像这样: for (int i = 0; i 0) { child_pid = fork(); childs[i] = child_pid; } if (child_pid < 0) printf("Error…\n"); } 现在,我必须在每个孩子身上打印出他是什么孩子,从0开始,所以我在想这个: printf(“This is child #%d\n”, getpid() – getppid()); 但我不确定,这总是有效吗?如果父母创建子系统时操作系统会创建另一个进程,那么孩子的数量将会停止? 最后,如果答案是肯定的,我怎样才能让#n孩子知道他是儿童编号n?

Fork永远不会进入孩子的过程

我正在编写一个模仿shell行为的代码,特别是&和|。 我的函数接收用户命令,并检查是否有&在最后,然后子进程应该在后台运行,父进程不应该等待它完成并继续执行命令。 它也应该检查是否有| 在输入数组中运行两个子进程,同时管道他们的stdin和stdout。 我已经实现了&的行为,但每当我编译并运行我的代码时,我只从父进程中获取printf语句。 我想听听如何解决这个问题的想法,此外,我将不胜感激任何关于|的实施的建议 (管道)以及如何防止僵尸。 int process_arglist(int count, char** arglist) { int pid = fork(); printf(“%d”, pid); switch (pid) { case -1: fprintf(stderr, “ERROR: fork failed\n”); return 1; break; case 0: // Son’s proccess printf(“I got to son”); //check last arglist argument if (strcmp(arglist[count – 1], “&”) == 0) { setpgid(0, 0); arglist[count […]

父尝试读取子退出状态(或返回值),fork和wait

我糊涂了。 据说,基于man和许多其他来源,如下所示: 当操作系统终止你的进程等待(和状态) 时返回代码应该能让我获得子进程的退出状态或返回值吗? 那两段代码,应该让我看到它的孩子的退出值,然后打印出来。 子进程函数: int childFunction(char in[],char logPath[]){ FILE *logFile= fopen( logPath, “a” ); if(logFile==NULL) return 1; int c=system(in); fclose(logFile); return(c); } 主要: {…some unimportant code before this} result= fork(); if(result==0){ exit(childFunction(inLine,logPath)); } else if(result>0){ int status=0;; int c=(int)waitpid(-1,&status,0); printf(“a:%db:%d\n”,status, WIFEXITED(status)); else return -1; i=0; 我试着等待,睡了一段时间,退出,返回,并阅读手册页几次。 在我对这个function的理解中存在一个基本错误,或者在看了4个小时后我再也看不到它了。 已解决由于某些原因,我绝对不明白,如果你将childFunction中的return(c)更改为if(c!=)return(1);else return(0)它将起作用。 不知道为什么。 已解决2好的,现在我想我知道为什么。 看,似乎返回调用或等待将状态减少到8个最高有效位(256)。 那是什么意思? […]

在后台C linux中运行一个新的子进程

我正在尝试在后台运行一个新进程,以便继续使用父进程。 我用fork然后execl。 我试图在execl命令中添加参数&但它不起作用: execl(“newproc”,”newproc”,”arg1″,”&”,NULL); 有什么解决方案吗?

C – 检索大于8位的子退出状态

注意:为简单起见,我没有包含太多错误检查,我的示例代码实际上没有任何实际用途。 我想要的是: 我想要一个fork()是一个子进程的程序,并让它使用execl()调用一个进程。 然后我的父母检索该进程的退出代码。 这是相当微不足道的。 我尝试了什么: int main(int argc, char** argv) { int ch = fork(); if(ch == -1) { perror(NULL); }else if(ch == 0) { // In child, invoke process execl(“/path/process”, “process”, 0); }else { // In parent, retrieve child exit code int status = 0; wait(&status); // print exit status if(WIFEXITED(status)) printf(“%d\n”, WEXITSTATUS(status)); […]

将孩子的stdout传递给父母stdin

我尝试将子进程中的程序的stdout传递给父进程中的stdin。 在bash中,这将是这样的: wget“adress”|少 我的代码如下所示: int fd[2]; pid_t child_id; int status; char *args[] = {“wget”,”-O -“,argv[1], NULL}; int pipe(int fd[2]); child_id = fork(); if (child_id == -1) { printf (“Fork error\n”); } if (child_id == 0) { close(fd[0]); int c = dup2(fd[1],1); execl (“/usr/bin/wget”, “wget”, “-qO-“,argv[1], NULL); } else{ waitpid(child_id,&status,0); close(fd[1]); int c2 = dup2(fd[0],STDIN_FILENO); printf(“%i\n”,c2 […]