Я хочу записать PID в определенный файл. Пока он повторяет pid в терминале. Но как записать этот PID в файл?
int main()
{
pid_t pid = getpid();
printf("%lu\n", pid);
char *filename = "/.wirebot/pid.txt";
char *home_dir = getenv("HOME");
char *filepath = malloc(strlen(home_dir) + strlen(filename) + 1);
strncpy(filepath, home_dir, strlen(home_dir) + 1);
strncat(filepath, filename, strlen(filename) + 1);
FILE *fp;
fp = fopen(filepath, "w");
if (fp == NULL) {
} else {
fputs("%lu\n", pid, fp);
fclose(fp);
}
}
Слишком много аргументов в fputs - это ошибка, которую я получаю.
Функцию freopen можно использовать для перенаправления STDIN в файл.
@abelenky неясно, что он на самом деле хочет сделать, потому что он уже пытается напечатать pid в файл с помощью fputs("%lu\n", pid, fp);, что, конечно, неправильно.
Кстати: не имеет отношения к вашей проблеме: не используйте strncpy, вероятно, это не то, что вы думаете. Внимательно прочитайте его документацию. strncpy — это не то же самое, что более безопасная версия strcpy.
@abelenky freopen тоже была моя первая мысль. Но вопрос был о STDOUT, а не о вводе.
@harper: Опечатка с моей стороны: я имел в виду перенаправление stdout, а не stdin. Но ответ остается: freopen — вероятный кандидат на то, что они пытаются сделать.
Sascha7777, В сторону: Подумайте об упрощении strncpy(filepath, home_dir, strlen(home_dir) + 1); strncat(filepath, filename, strlen(filename) + 1); до sprintf(filepath, "%s%s", home_dir, filename);. Пусть компилятор выдает эффективный код.
@chux Спасибо, я сделал это, и пока это работает. Хороший.
Вы должны взглянуть на функцию fprintf(). Просто не забудьте проверить (из вашего кода я предполагаю, что вы, вероятно, пытаетесь что-то делать с процессами, а затем вы попробуете это с разветвлением), как обрабатывать несколько процессов, записывающих в один и тот же файл.
Вот пример кода для этого. Вы открываете файл, а затем используете fprintf для записи в него.
// C Program for the above approach
#include<stdio.h>
int main()
{
int i, n=2;
char str[50];
//open file sample.txt in write mode
FILE *fptr = fopen("sample.txt", "w");
if (fptr == NULL)
{
printf("Could not open file");
return 0;
}
for (i = 0; i < n; i++)
{
puts("Enter a name");
scanf("%[^\n]%*c", str);
fprintf(fptr,"%d.%s\n", i, str);
}
fclose(fptr);
return 0;
}
Без ширины scanf("%[^\n]%*c", str); существует риск переполнения буфера. Также проблема заключается в том, что пользователь вводит "\n". Рекомендую fgets() и отрубаю '\n'.
Это всего лишь пример того, как использовать fprintf(), не нужно иметь пуленепробиваемый код, верно?
Не нужно". Это зависит от качества ответа, который вы хотите. Ваш звонок.
Как перенаправить вывод printf в файл?
Используйте freopen(new_filename, "w", stdout)
if (freopen(new_filename, "w", stdout)) {
fprintf(stderr, "Success\n");
printf("%lld\n", (long long) pid);
} else {
fprintf(stderr, "Failed\n"):
}
Но как записать этот PID в файл?
Можно напрямую использовать fprintf().
// fputs("%lu\n", pid, fp);
fprintf(fp, "%lld\n", (long long) pid);
См. также Какой правильный спецификатор printf для печати pid_t.
Используете fprintf вместо fputs? Разве вы не получали ошибки/предупреждения компилятора? Вы включили stdio.h?