nixp.ru v3.0

15 ноября 2024,
пятница,
22:25:39 MSK

t3st3r написал 31 июля 2006 года в 19:03 (1068 просмотров) Ведет себя неопределенно; открыл 11 тем в форуме, оставил 14 комментариев на сайте.

Извините что такие вопросы, тупые, когда разбираюсь с ними, то понимаю, какой я тупой :)), но вот никак не пойму как работают эти функции, делал прогу, с fork(), и проверка если (child_pid != 0) значит родительский процесс, если нет, значит порождаемый, так вот ингода пишет, что я нахожусь токо в род-ом процессе, перезапускаю прогу пишет, что в род-ом, а потом видимо заходит в порождаемый и выходит, получается, что я не могу точно узнать попаду я в порождаемый процесс?

Feuerbach

Нихрена не понял.

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

t3st3r

код:

#include …

int spawn() {

pid_t child_pid;

child_pid = fork();

if(child_pid != 0) {

return child_pid;

}

else {

execvp(prog, *var_list);

fprintf(stderr, «an error…\n»);

}

int main(void) {

char *list[] = {«ls», «-l», «/», NULL};

spawn(«ls», list);

printf(«Done with main process»);

return 0;

}

Так вот, ингода запускаю пишется просто Done with main process (т.е. я так понимаю я не попал в порождаемый процесс?), а иногда выводит какую-то инфу типа:

Exception: STATUS_ACCESS_VIOLATION

далее значения в регистрах.

Я ВОБЩЕ НЕ ПОНИМАЮ СМЫСЛА В ЭТОМ, ПЛИЗ ОБЪЯСНИТЕ

rgo

ну, это сложно считать законченным кодом, ибо он не будет компилироваться. И даже не из-за отсутствия инклюдов (их я бы смог приписать). По другим причинам — странный заголовок функции spawn, странная структура (количество { не равно количеству })… вот рабочий пример:

#include 
#include 
#include 
#include 
#include 
pid_t spawn (const char *cmd, const char **args)
{
        pid_t pid = fork ();
        if (pid == 0) {
                printf ("child: exec'ing `%s'.\n", cmd);
                execvp (cmd, args);
                perror ("child error in execvp");
        } else if (pid < 0) {
                perror ("parent error in fork");
                return 0;
        }
        return pid;
}
int main ()
{
        char *args[] = {"-l", "/", NULL};
        int child_status;
        pid_t child_pid = spawn ("ls", args);
        if (child_pid == 0)
                return 1;
        printf ("parent: child started with pid %d. waiting for him...\n",
                child_pid);
        waitpid (child_pid, &child_status, 0);
        printf ("parent: Ok. Child terminates with status %d.\n", child_status);
        return 0;
}
t3st3r

Был признателен, если бы были комменты, я очень плохо в это врубился, соррии…

rgo
t3st3r
Был признателен, если бы были комменты, я очень плохо в это врубился, соррии…

мне было бы их несложно вписать, и я бы их вписал, если бы я понимал что там надо комментировать. ;)

тут используется всего пять функций: printf, perror, fork, execvp и waitpid. Все они описаны в man’ах. В чём проблема? Читай мануалы и медитируй над ними и примером — лучший способ воткнуть. :)

t3st3r

Я так понял что если после fork pid равен 0, то мы в порожденном процессе?

И я еще читал, что в execvp первый аргумент это название запускаемой проги, а второй это опции этой проги с последним элементом NULL, но так как во все проги 0 элементом идет название проги, то и во втором аргументе execvp нулевым элементом в массиве тоже должно быть назваине проги, именно поэтому в моем коде нулевым эл. был ls

t3st3r

и еще небольшой вопрос что это за тип size_t?

Genie

grep -r size_t /usr/include

?

Feuerbach
t3st3r
и еще небольшой вопрос что это за тип size_t?

Целочисленный тип, который используется при работе с памятью.

myst

t3st3r, может пора почитать таки man’ы?

t3st3r

Я же не заставляю отвечать, просто если у меня появляется вопрос я спрашиваю, про тот же форк я читал, делал пример но непонял как он работает, про size_t его я не нашел в манах, вот и спросил, так что не надо флеймить

to Feuerbach СПАСИБО за ответы, но про форк ответа не получил :(

Feuerbach
t3st3r
Я так понял что если после fork pid равен 0, то мы в порожденном процессе?

Цитата из fork(2):

On success, the PID of the child process is returned in the parent's thread of execution, and a 0 is returned in the child's thread of execution.


t3st3r
И я еще читал, что в execvp первый аргумент это название запускаемой проги, а второй это опции этой проги с последним элементом NULL, но так как во все проги 0 элементом идет название проги, то и во втором аргументе execvp нулевым элементом в массиве тоже должно быть назваине проги, именно поэтому в моем коде нулевым эл. был ls

Цитата из exec(3)

The first argument, by convention, should point to the filename associated with the file being executed.

Ты до сих пор считаешь, что тебя несправедливо отослали к man?

Последние комментарии

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.