当前位置: 首页 > 面试题库 >

在输出中看不到execl之前打印

易嘉胜
2023-03-14
问题内容
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

int main(void)
{
    pid_t Checksum_pid = fork();

    if (Checksum_pid < 0)
        printf("Fork Failed\n");
    else if (Checksum_pid == 0)
    {
    printf("\nInside Child Process before execl");        
    //execl("/bin/sleep", "/bin/sleep", "2", NULL);
    execl("/bin/ls","ls",(char *)NULL) ;
        //exit(EXIT_FAILURE);
    printf("\nInside Child Process after execl\n");
    exit(EXIT_FAILURE);
    }
    else
    {
        int childStatus;        
    printf("\nInside Parent Process");
    sleep(5);
    pid_t returnValue = waitpid(Checksum_pid, &childStatus, WNOHANG);

        if (returnValue > 0)
        {
            if (WIFEXITED(childStatus))
                printf("\nChild Exit Code: %d\n", WEXITSTATUS(childStatus));
            else
                printf("\nChild Exit Status: 0x%.4X\n", childStatus);
        }
        else if (returnValue == 0)
            printf("\nChild process still running\n");
        else
        {
            if (errno == ECHILD)
                printf("\nError ECHILD!!\n");
            else if (errno == EINTR)
                printf("\nError EINTR!!\n");
            else
                printf("\nError EINVAL!!\n");
        }
    printf("\nParent: I am about to finish\n");
    }

    return 0;
}

输出:

kth4kor-2:~/bosch/Test1$ ./a.out  a.out  ___waitpid_test1  waitpid_test1~  waitpid_test1.c  waitpid_test1.c~  waitpid_test2.c  waitpid_test2.c~ 
Inside Parent Process Child Exit Code: 0
Parent: I am about to finish

现在,如果我将删除parent中的sleep(5),则输出:

kth4kor-2:~/bosch/Test1$ ./a.out 
Inside Parent Process

Child process still running

Parent: I am about to finish

kth4kor@g3gdev-kth4kor-2:~/bosch/Test1$ a.out  ___waitpid_test1  waitpid_test1~  waitpid_test1.c  waitpid_test1.c~  waitpid_test2.c  waitpid_test2.c~

最后,我尝试使用0作为waitpid而不是WNOHANG的第三个参数,然后在下面的输出中显示了所有child的打印内容:

kth4kor-2:~/bosch/Test1$ ./a.out 
a.out  ___waitpid_test1  waitpid_test1~  waitpid_test1.c  waitpid_test1.c~  waitpid_test2.c  waitpid_test2.c~
Inside Parent Process
Child Exit Code: 0
Parent: I am about to finish

有人可以帮助我理解执行execl之后和执行之前的行为吗?


问题答案:

请记住,通过printf(至stdout)的输出通常是 行缓冲的
。这意味着输出缓冲区将在换行符上刷新。由于您要打印的字符串后没有换行符,因此不会清除输出缓冲区。

在字符串的最后添加换行符,或使用手动刷新缓冲区fflush



 类似资料:
  • 问题内容: 我有一个python脚本test.py: 在linux命令行上执行 返回: 然后执行 哪个返回 如何重定向输出使os.system调用在print语句之前打印? 问题答案: 当您输出到管道时,Python缓冲写入的输出,并在刷新,溢出,关闭后(程序退出时)输出。虽然它将缓冲打印调用,但系统调用输出将直接输出到stdout中,并且其输出将不会被缓冲。这就是为什么您会看到这样的优先级。为了

  • 我在Gradle中使用这个问题执行shell脚本作为参考,但是,我无法弄清楚如何让它工作。 这是我的档案: 我myScript.sh #! /bin/sh 回显脚本文件中的Hello world 但是,每当我运行脚本时,我只能看到“来自gradle的Hello world”,而看不到“来自脚本文件的Hello world”。 为什么?

  • sharedWorker 脚本中使用 console.log('sharedWorker')发现输出无法在控制台中查看,换成 new Worker('../workers/sharedWorker.js') 却是可以的。怎么查看 SharedWorker 脚本的输出?

  • execl(执行文件) 相关函数 fork,execle,execlp,execv,execve,execvp 表头文件 #include<unistd.h> 定义函数 int execl(const char * path,const char * arg,....); 函数说明 execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、ar

  • execl 执行文件 相关函数 fork,execle,execlp,execv,execve,execvp 表头文件 #include<unistd.h> 定义函数 int execl(const char *path, const char *arg, ....); 函数说明 execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、a

  • 问题内容: 我正在调试Linux(特别是ubuntu服务器9.04)的驱动程序,并且代码中有几个printf语句。 在哪里可以查看这些语句的输出? EDIT1:我要执行的操作是使用proc文件系统写入内核。打印代码是 在kern.log中,当我尝试覆盖文件/ proc / net / madwifi / ath1 / fractel_config(当然会随着时间的变化)时,看到以下消息。 有什么解