ФАЙЛ напишите;SSH_AGENT_PID = 2547? - PullRequest
0 голосов
/ 08 ноября 2011

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

SSH_AGENT_PID=2547 

Скажите, пожалуйста, что это значит и как я могу избежать этого? Заранее спасибо.

Вот мой код

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

int main(int argc, char *argv[])
{
        int i;
        FILE *fp;

        fp = fopen(argv[1], "w");
        for(i = 0; i < argc; i ++)
        {
                fprintf(fp, argv[i + 2]);
                fprintf(fp, " ");
        }
        fclose(fp);

        return 0;
}

Это то, что я вижу в моей командной строке

[root@localhost basicC]# cc file_create_write.c
[root@localhost basicC]# ./a.out /root/kernel_programming/basicC/test_file.txt ajish alfred in focuz infotech
[root@localhost basicC]# cat test_file.txt
ajish alfred in focuz infotech  SSH_AGENT_PID=2547 [root@localhost basicC]#

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

Некоторые системы на самом деле имеют три аргумента main, где третий аргумент содержит переменные среды. Вы бежите из конца argv (как отмечает Игорь Окс) и попадаете в список переменных среды; если вы посмотрите на переменные окружения, вы должны увидеть SSH_AGENT_PID со значением 2547 (или другим числом).

Ваш цикл должен выглядеть примерно так:

for(i = 2; i < argc; i++)
    fprintf(fp, "%s ", argv[i]);

Вас не волнует argv[0], и вы уже использовали argv[1] для имени файла, поэтому вы хотите начать с argv[2], а не добавлять 2 к i.

Я также изменил ваш fprintf вызов, чтобы использовать явную строку формата. Если вы этого не сделаете, то, что находится в argv[i], будет интерпретировано как строка формата, и вы получите странные вещи, если argv[i] содержит знак процента.

Кроме того, похоже, что вы изучаете программирование на С, когда вы вошли в систему как пользователь root. Это плохая идея. Очень очень плохая идея. Еще хуже идея, что при выполнении обычных задач вы вошли в систему как root. Вы должны войти в систему как обычный пользователь, чтобы случайно не удалить /dev или что-то еще.

0 голосов
/ 08 ноября 2011

argc содержит количество аргументов, переданных программе.Когда вы получаете доступ к argv[argc] и argv[argc+1], вы фактически получаете доступ к областям памяти вне пределов.

Вы можете сделать

for(i = 2; i < argc; i++)
{
    fprintf(fp, argv[i]);

вместо

for(i = 0; i < argc; i++)
{
    fprintf(fp, argv[i + 2]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...