2015-02-23 9 views
-1
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <stdlib.h> 
#include <fcntl.h> // open 
#include <stdio.h> 

int main() { 
    close(1); // close standard out 
    open("log.txt", O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR); 
    puts("Captain's log"); 
    chdir("/usr/include"); 
    execl("/bin/ls", "ls", ".", (char *)NULL); 
    perror("exec failed"); 
    return 0; 
} 

Когда я проверяю log.txt, я не смог найти «Капитанский журнал». Я предполагал, что он работает до execl, поэтому он должен быть там!почему execl перезаписать файл

+0

Попробуйте 'fflush (STDOUT),' – immibis

+0

@kww вы решить эту проблему? –

+0

@immibis Когда я добавляю 'fflush (stdout);' после 'puts («Капитанский журнал»), он работает. Благодаря! – kww

ответ

0

Вы пишете его до стандартного вывода, почему вы ожидаете, что он будет в файле?

Если вы хотите перенаправить stdout просто использовать freopen()

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 

#include <unistd.h> 

int main() 
{ 
    FILE *file; 

    file = freopen("log.txt", "w", stdout); 
    if (file == NULL) 
     return -1; 

    printf("Captain's log"); 
    chdir("/usr/include"); 

    if (execl("/bin/ls", "ls", ".", NULL) != 0) 
     perror("exec failed"); 
    fclose(file); 

    return 0; 
} 
+0

Привет, я запустил ваш код, но не смог найти «Журнал Capitain» в log.txt. Вы запустили свой код? Когда я закрыл выход на стойку, я думаю, что он должен перейти в log.txt. Это также результат вывода execl. Я хочу знать, не работает ли это так, как я думал. – kww

+0

Я думаю, что @immibis прав. Ваш код также работает, если вы добавите 'fflush (stdout);' после 'printf («Капитанский журнал»); – kww

+0

@kww так просто 'printf (« Капитанский журнал \ n ")'? И мой код работает из-за 'fclose()', так как 'fclose()' также удаляет буферы. –

Смежные вопросы