Пишем собственный init на С

Потребовалось мне как-то написать свой init, для ускорения загрузки. Особенность, в том что он должен быть статически слинкован и не должен завершаться, кроме этого во время работы инита могут быть не доступны stdin и stdout.

#include <stdio.h>
#include <sys/mount.h>

int main()
{
    fprintf(stderr, "Hello World Init!\n");

    /* mount /proc for example */
    if(mount("none", "/proc", "proc", 0, NULL) < 0) {
        perror("proc");
    }
    
    while(1);
{

Собираем файл: gcc -static -O0 init.c -o init

 

Стоит заметить что у меня инит запускался и динамически слинкованный, но в процессе его эксплуатации, он начинал вести себя не стабильно.

На stackoverflow нашел как можно решить проблему с недоступными stdin и stdout

int onefd = open("/dev/console", O_RDONLY, 0);
dup2(onefd, 0); // stdin
int twofd = open("/dev/console", O_RDWR, 0);
dup2(twofd, 1); // stdout
dup2(twofd, 2); // stderr

if (onefd > 2) close(onefd);
if (twofd > 2) close(twofd);

dreamway89

dreamway89 wrote 29 posts

Post navigation


Добавить комментарий

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>