Tag: fork

fork()打印前的语句两次

我正在尝试使用fork()并重新定向以检查父项中的重定向是否也适用于孩子。 我写了以下简单的程序 #include #include #include int main () { freopen( “error.txt”, “w+t”, stdout ); // From now on, stdout = error.txt printf (” ERROR! WHY DONT U UNDERSTAND?\n”); if ( fork() == 0 ) { printf(” I AM CHILD\n”); exit(0); } else- { printf (” EITHER I AM A PARENT OR SOMETHING GOT SCREWED\n”); } […]

到system()或fork()/ exec()?

在unix中,似乎有两种从C运行外部可执行文件的常用方法 system() 打电话和 pid = fork() switch(pid) //switch statement based on return value of pid, //one branch of which will include and exec() command 在函数等效的情况下,有没有理由更喜欢fork / exec而不是系统(父进程等待子进程完成,没有从子进程返回复杂的信息)?

只需检查c中的状态过程

我想知道一个过程的状态。 我想我可以使用等待系列function,但实际上我不想等待这个过程,只需检查状态并继续。 我想要类似的东西 checkStatusOfProcess(&status); if(status == WORKING) { //do something } else if(status == exited) { //do something else } else \\I dont care about other states

C中的这个多管道代码是否有意义?

几天我就提出了一个问题 。 我的解决方案符合接受的答案中的建议。 但是,我的一个朋友提出了以下解决方案: 请注意,代码已更新几次(查看编辑修订版)以反映下面答案中的建议。 如果您打算给出新的答案,请考虑这个新代码,而不是那些有很多问题的旧代码。 #include #include #include #include int main(int argc, char *argv[]){ int fd[2], i, aux, std0, std1; do { std0 = dup(0); // backup stdin std1 = dup(1); // backup stdout // let’s pretend I’m reading commands here in a shell prompt READ_COMMAND_FROM_PROMPT(); for(i=1; i 1) { dup2(aux, 0); close(aux); } […]

获取fork()的copy-on-write行为,不带fork()

我有一个大缓冲区: char *buf = malloc(1000000000); // 1GB 如果我分叉一个新进程,它将有一个buf,它与父进程的buf共享内存,直到一个或另一个写入它。 即使这样,内核也只需要分配一个新的4KiB块,其余的将继续共享。 我想复制一下buf,但我只想改变一点副本。 我想要不写分支的写时复制行为。 (就像你在分叉时免费获得的那样。) 这可能吗?

调用execvp()内部的重定向无法正常工作

我一直在实现一个使用execvp()执行给定命令的小程序。 不使用重定向时它工作正常,但是当我运行如下命令时: cat file1.txt > redirected.txt cat输出以下错误消息并失败: cat: >: No such file or directory cat: redirected.txt: No such file or directory 我已经做了一些挖掘,我开始认为也许execvp()不允许进行重定向,因为它不在shell中运行。 这是否意味着我必须在重定向发生时手动选择并在fork / exec代码中使用管道来解决这个限制? 有没有比使用execvp()更好的方法? 谢谢!

如何使用Fork()只创建2个子进程?

我开始学习一些C并且在学习fork时,等待函数我得到了意想不到的输出。 至少对于我来说。 有没有办法只从父级创建2个子进程? 这是我的代码: #include #include #include #include int main () { /* Create the pipe */ int fd [2]; pipe(fd); pid_t pid; pid_t pidb; pid = fork (); pidb = fork (); if (pid < 0) { printf ("Fork Failed\n"); return -1; } else if (pid == 0) { //printf("I'm the child\n"); } else […]

需要知道fork如何工作?

我正在尝试以下C代码: int main() { printf(“text1\n”); fork(); printf(“text2\n”); return 0; } 我期待得到输出,我得到两个“text1”和两个“text2”,如: text1 text1 text2 text2 但是,相反,我得到: text1 text2 text2 只有一个“text1”??? 好吧,如果子进程从fork()执行,那么为什么我得到两个“text1”用于以下内容: int main() { printf(“text1”); fork(); printf(“text2\n”); return 0; } 现在的输出是: text1text2 text1text2 如果子进程在fork之后启动,则输出应为: text1 text2 text2

如何退出子进程并从execvp()返回其状态?

在我简单的自定义shell中,我正在从标准输入中读取命令并使用execvp()执行它们。 在此之前,我创建了当前进程的fork,我在该子进程中调用了execvp(),之后,我调用exit(0)。 像这样的东西: pid = fork(); if(pid == -1) { perror(“fork”); exit(1); } if(pid == 0) { // CHILD PROCESS CODE GOES HERE… execvp(pArgs[0], pArgs); exit(0); } else { // PARENT PROCESS CODE GOES HERE… } 现在,使用execvp()运行的命令可以返回错误吗? 我想正确地处理它,现在,我总是调用exit(0),这意味着子进程将始终具有“OK”状态。 如何从execvp()调用返回正确的状态并将其放入exit()调用? 我应该只获取execvp()返回的int值并将其作为exit()参数而不是0传递。这是否足够正确?

将两个命令与管道组合在一起

我试图在一个(不存在的)命令中“合并”两个命令并管道它。我的意思是..假设你有这两个命令: grep text out.txt grep text out.txt ,可以表示这两个命令的(不存在)命令可能类似于(grepwc -l < file.txt) ,然后将行数输出到out.txt中。 基本上这些(grepwc)命令应该与grep text out.txt具有相同的行为 grep text out.txt但更短。 我尝试过这样的事情,但我认为我的方法远远不能实现目标。 我使用名为commlist的结构,其中包含已由cmd,argc和argv解析的命令。 inputfile和outputfile是open()上使用的文件的路径名。 我正在使用的结构。 typedef struct command { char *cmd; int argc; char *argv[MAXARGS+1]; struct command *next; } COMMAND; 和代码: void execute(COMMAND *commlist) { int fd[2]; pid_t pid; int n_pipes=2; //pipes needed COMMAND *aux = commlist; int […]