我正在尝试编写shell但我无法理解为什么"> "
函数结束后主进程不会打印createProcess
。
还有一种更好的方法来打印主流程中的东西吗?我已使用此if (mainPid == getpid()
。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
void createProcess(){
pid_t pid;
pid = fork();
if (pid == 0){
printf("Process created\n");
printf("Child pid is %d\n", getpid());
}
}
char *read_line(){
char *line = NULL;
size_t bufsize = 0;
getline(&line, &bufsize, stdin);
return line;
}
int main(){
pid_t mainPid = getpid();
char* line = NULL;
for (;;) {
if (mainPid == getpid()){
printf("> ");
line = read_line();
if (line[strlen(line) - 1] == '\n')
line[strlen(line) - 1] = '\0';
if (strcmp(line, "create") == 0)
createProcess();
else printf("Write \"Create\"\n" );
}
}
free(line);
return 0;
}
预期产出
> create
Process created
Child pid is 2417
>
答案 0 :(得分:1)
您应该在fflush(stdout)
之后调用printf("> ")
以确保显示字符串,因为它不是以换行结束,而是stdout是行缓冲的。但是,在子进程有机会写入之前可能会显示"> "
,实际输出"> Process created"
。
此外,仅仅比较PID,子进程将在for(;;)
中无限循环,所以你也应该修复它。
答案 1 :(得分:1)
P
所以我测试了它并得到了这个^(注意&#34;&gt;&#34;之前&#34;创建过程&#34;)。 这意味着它打印出的不是您想要的顺序。
修改此修复:
> create
> Process created
Child pid is 5655
得到了这个输出:
void createProcess(){
pid_t pid;
pid = fork();
if (pid == 0){
printf("Process created\n");
printf("Child pid is %d\n", getpid());
exit(0);
}
if (pid > 0) {
int stat_loc;
wait(&stat_loc);
}
}
答案 2 :(得分:1)
请注意,您在子进程中有一个活动循环,这可能会导致意外的副作用。
以下是发生的事情
for(;;) unterminated loop
| if parent => ok first pass is parent
| fork
-----------------------------
| (parent) | (child)
| loop as expected | still loops!
| getpid() != mainPid so won't read a line
| and infinitely loops...
你的循环应该是:
while (mainPid == getpid()){ // let child terminate...
printf("> ");
line = read_line();
if (line[strlen(line) - 1] == '\n')
line[strlen(line) - 1] = '\0';
if (strcmp(line, "create") == 0)
createProcess();
else if (strcmp(line, "exit") == 0) break; // add clean exit...
else printf("Write \"Create\"\n" );
}
正确使用Clang编译器...